OS Monitor

조건 변수 while 규칙과 식사하는 철학자 문제

모니터는 공유 상태와 동기화 연산을 한곳에 묶고, 조건 변수는 상태가 만족될 때까지 기다리는 프로토콜을 제공한다.

01

진입 잠금

모니터 메서드에 들어온 스레드는 공유 상태를 보호하는 락을 획득한다.

exclusive entry
02

조건 대기

조건이 거짓이면 condition wait가 락을 놓고 잠들었다가 깨어나며 다시 락을 잡는다.

wait releases lock
03

while 재검사

허위 각성이나 경쟁 스레드 때문에 깨어난 뒤 조건을 반드시 다시 검사한다.

spurious wakeup
04

고전 문제 적용

철학자 문제는 젓가락 획득 순서와 대기 조건을 어떻게 설계하는지 보여준다.

deadlock avoidance
signal
조건을 만족하게 만든 스레드가 기다리는 스레드를 깨운다. 깨운다고 즉시 실행되는 것은 아니며 락 경쟁이 남는다.
wake not run
broadcast
여러 대기자가 서로 다른 조건을 기다리면 모두 깨워 재검사하게 할 수 있다. 불필요한 wakeup 비용이 있으므로 조건 설계를 본다.
thundering herd
철학자
모두 왼쪽 젓가락만 들면 순환 대기가 생긴다. 번호 순서, waiter, 홀짝 전략으로 cycle을 끊는다.
break circular wait

조건 변수 버그 방지

if 금지 wait 조건은 if가 아니라 while로 감싼다.
상태 변경 순서 공유 상태를 바꾼 뒤 signal 또는 broadcast를 호출한다.
락 범위 조건 확인과 상태 변경이 같은 mutex 아래에서 일어난다.

while 규칙

pthread_mutex_lock(&m);
while (!ready) pthread_cond_wait(&cv, &m);
consume();
pthread_mutex_unlock(&m);