reader writer problem
Writer: Book.txt 파일에 값을 저장하는 프로세스
Reader: Book.txt 파일에 저장된 값을 읽어들이는 프로세스
Reader와 Writer 프로세스는 무작정 아무렇게나 실행되어선 안된다.
실행의 순서가 있기 때문
Reader 프로세스는 ‘Book.txt 안에 값이 존재한다’는 특정 조건이 만족되어야만 실행 가능
bank account problem
공유가 불가능한 자원의 동시 사용을 피하기 위한 동기화
현재 계좌 잔액: 10만원
프로세스 A는 현재 잔액에 2만원을 추가하는 프로세스
프로세스 B는 현재 잔액에 5만원을 추가하는 프로세스
A와 B를 동시에 실행하면 두 프로세스가 잔액 데이터에 동시에 접근하여 잘못된 잔액 결과를 낳을 수도 있다.
producer & consumer problem
물건을 계속해서 생산하는 생산자(producer, 프로세스 혹은 스레드)
물건을 계속해서 소비하는 소비자(consumer, 프로세스 혹은 스레드)
‘총합’ 변수 공유
초기 총합이 0일때, 생산자, 소비자를 각각 1만번씩 실행하면 총합이 0이 아닐수도 있다.
임계 구역에 진입하고자 하면 진입한 프로세스 이외에는 대기해야 한다.
임계 구역에 동시에 접근하면 자원의 일관성이 깨질 수 있다.
이러한 상황을 레이스 컨디션(race condition)이라고 한다.
💡 레이스 컨디션이 발생하는 이유: 고급 언어로 한줄의 코드가 저급언어로 변환되면 한줄이 아닐 수 있게 된다.val int lock = 0 // 0이면 사용 가능
fun critical() {
while(testAndSet(lock) == 1){
// 누군가 critical section에 진입해 있으면 갇히게 됨
}
... critical section
lock = 0
}
// 조건문 검사, 현재 락이 0이면 1로 만들고 0을 반환하여 critical section에 진입 가능
fun testAndSet(): Int {
int oldLock = lock
lock = 1
return oldLock
}
상호 배제를 위한 동기화 도구(자물쇠 역할), 뮤텍스 락
자물쇠 역할: 프로세스들이 공유하는 전역 변수 lock
임계 구역을 잠그는 역할: acquire 함수
임계 구역의 잠금을 해제하는 역할: release 함수
자물쇠를 지속적으로 확인하는 대기 방식을 바쁜 대기라고 한다.
val lock = 1// 락을 얻어야 임계 구역에서 작업이 가능하다.
val guard = true;
// 프로세스가 임계 구역에 진입하기 전에 호출
fun acquire() {
while(guard == false){} // 가드를 먼저 얻는다.
if(lock <= 0){
// 잠겨 있으면 현재 스레드를 큐에 넣는다.
guard = true & 자러 간다.
}else {
// 락을 획득
// 열리면 임계 구역 잠근 후 임계 구역에서 작업 진행
lock = true // 락을 잠근다.
}
}
// 임계 구역에서 작업 끝난 후 호출
fun release() {
if(큐에 하나라도 대기중이라면) {
그 중에 하나를 깨운다
}else {
lock = false // 잠금 해제
}
guard= true
}
뮤텍스 락에 비해 좀 더 일반화된 방식의 동기화 도구
공유 자원이 여러 개 있는 경우에도 적용 가능
전역 변수 하나와 함수 2개가 필요
임계 구역에 진입할 수 있는 프로세스의 개수를 나타내는 전역 변수 S
임계 구역에 들어가도 좋은지, 기다려야 할지 알려주는 wait 함수
임계 구역 앞에서 기다리는 프로세스에 ‘이제 가도 좋다’고 신호를 주는 signal 함수
val S = 3 // 진입할 수 있는 프로세스의 수
fun wait(){
// 현재 진입할 수 있는 프로세스의 수가 0이하면 대기
while( S <= 0 ) {
// 대기
}
S-- // 대기가 끝나면 진입할 수 있는 프로세스 수 하나 감소시키고 임계 구역 진입
}
// 임계 구역에서 작업 끝난 후 호출
fun signal() {
S++ // 진입 가능한 프로세스 수 ++
}
세마포를 활용한 실행 순서 동기화
위와 같은 휴먼에러를 방지하기 위해 등장
혼자 공부하는 컴퓨터 구조 + 운영체제 - 강민철