Monitor

모니터 조건 변수 구조

모니터는 lock으로 보호되는 데이터와 그 데이터를 기다리는 조건을 함께 묶는다. 조건 변수는 알림 자체가 아니라 상태 predicate를 다시 확인해야 한다.

01

상태를 monitor 안에 숨긴다

queue, count, flag 같은 공유 데이터는 monitor procedure를 통해서만 바꾸게 한다.

02

조건을 while로 검사한다

condition variable에서 깨어난 뒤에도 predicate가 참인지 다시 확인해야 한다.

03

signal 위치를 맞춘다

상태를 바꾼 뒤 대기자가 다시 진행할 수 있을 때 signal 또는 broadcast를 보낸다.

Mutual exclusion
monitor 진입 제어 한 시점에 하나의 thread만 monitor 내부 상태를 바꾼다.
언어 또는 라이브러리가 제공한다.
Condition variable
조건 대기 조건이 아직 안 맞으면 lock을 풀고 기다린다.
알림은 상태가 아니다.
Hoare vs Mesa
signal 의미 차이 깨운 즉시 넘기는지, 나중에 다시 경쟁하는지 모델이 다르다.
현대 구현은 대개 재검사가 필요하다.
Producer consumer
대표 패턴 notEmpty와 notFull 조건을 monitor 내부에 둔다.
predicate 이름이 품질이다.

while · 캡슐화 · broadcast 점검

while 조건 변수 wait가 if가 아니라 while 또는 predicate wait로 감싸져 있는가.
캡슐화 monitor 밖에서 공유 상태를 직접 수정하는 경로가 없는가.
broadcast 여러 대기자가 조건을 다시 봐야 하는 상황에서 signal 하나로 충분한가.

조건 대기

lock(m);
while (queue.empty()) wait(notEmpty, m);
item = queue.pop();
unlock(m);