Classical Problems of Synchronization
Bounded-Buffer Problem
Producer
Consumet
Solution
위의 코드는 Reader은 read는 동시에 해도 된다고 했으므로 readcount에서 1을증가 시켜 최초의
프로세스라면 lock 을 걸고 그후 readcount가 2부터는 lock을 걸 필요가 없다.
그리고 마지막으로 나가는 프로세스일 경우에는 lock을 풀어준다.
철학자 5명이 앉아있고 앞에 놓여진 젓가락을 2개 사용하여 밥을 먹을수 있을때의 상황
앞의 solution의 문제점
해결 방안
Semaphore의 문제점
코딩하기 힘들다
정확성의 입증이 어렵다
자발작 협력이 필요하다.
한번의 실수가 모든 시스템에 치명적 영향
모니터 내에서는 한번에 하나의 프로세스만이 활동 가능
프로그래머가 동기화 제약 조건을 명시적으로 코딩할 필요없음
프로세스가 모니터 안에서 가디를 수 있도록 하기 위해 condition variable 사용
Condition variable 은 wait와 signal 연산에 의해서만 접근 가능
x.wait();
x.wait()을 invoke한 프로세스는 다른 프로세스가 x.signal()을 invoke 하기 전 까지 suspend된다.
x.signal();
x.signal()은 정확하게 하나의 suspend된 프로세스를 resume한다.
Suspend된 프로세스가 없으면 아무 일도 일어나지 않는다.
monitor는 공유버퍼가 안에 정의되어 있기 때문에 생산하거나 소비하는 작업을 하기위해는 monitor 내부코드를 실행해야 되고 그러면 생산자든 소비자든 하나의 프로세스가 monitor안에서 활성화 하기 때문에 굳이 lock을 걸지않아도 생산자가 접근하는 동안에 또다른 생산자나 소비자가 접근해서 생기는 문제는 고려해볼 필요가 없다. 그래서 lock 을 거는 코드는 없다.