고전적인 동기화 문제들에는 3가지가 있다.
1 ) 유한 버퍼 문제
→ 생산자와 소비자는 크기가 n인 유한 버퍼를 공유하여 동기화
→ mutex : 초기화 1로 (바이너리 동기화)
→ empty : 생산자가 버퍼가 비어있는지 확인할 때 사용 (counting 동기화)
→ full : 소비자가 버퍼가 가득 차 있는지 확인할 때 사용 (counting 동기화)
2 ) readers-writers 문제
→ 여러 프로세스가 자료를 공유함
→ 리더가 활동할 때는 다른 리더들이 공유 데이터에 접근 가능
→ 기록자가 활동할 때는 상호배제가 보장되어야 함.
- 다양한 변형 문제가 존재함
data set
semaphore rw_mutex = 1;
semaphore mutex = 1; // 상호 배제 read_count 변경
int read_count = 0;
3 ) 식사하는 철학자 문제
→ 철학자의 두 가지 행동 : 생각하기, 먹기
→ 다른 철학자와는 교류하지 않고, 배고프면 2개 젓가락을 들고 밥을 먹음.
do {
wait(chopstick[i]);
wait(chopstick[(i+1 % 5)]);
//eat
signal(chopstick[i]);
signal(chopstick[(i+1) %5)];
//think
}while(TRUE);
이 코드의 경우 교착상태의 문제점이 있음
→ 철학자가 동시에 자신의 왼쪽 젓가락만 드는 경우
→ 모니터를 이용하여 이런 문제점을 해결함
→ Cf) 모니터는 모니터 안에서 하나의 프로세스만 활동 가능을 보장함.