7.1 Classic Problems of Synchronization - p.289
7.1.1 Bounded-Buffer (Producer–Consumer) Problem
- 생산자(Producer) 는 버퍼에 데이터를 추가하고, 소비자(Consumer) 는 버퍼에서 데이터를 제거함
- 버퍼가 가득 차면 생산자는 대기해야 하며, 비어 있으면 소비자는 대기해야 함
세마포어 기반 해결 방법
Semaphore full = 0, empty = n, mutex = 1;
do {
// Producer
produce_item(item);
wait(empty);
wait(mutex);
insert_item(item);
signal(mutex);
signal(full);
} while(true);
do {
// Consumer
wait(full);
wait(mutex);
remove_item(item);
signal(mutex);
signal(empty);
consume_item(item);
} while(true);
mutex: 상호배제 보장
empty / full: 버퍼 상태 제어
- 생산자와 소비자가 동시에 접근하지 않도록 보호함
7.1.2 Readers–Writers Problem
- 여러 Reader 프로세스가 동시에 읽기 가능하지만, Writer 가 쓰는 동안에는 읽기 불가함
- 두 가지 변형 존재:
- First Readers–Writers Problem: Writer는 Reader들이 모두 끝날 때까지 기다림
- Second Readers–Writers Problem: Writer가 대기 중이면 새 Reader 진입 금지 (Writer 우선)
세마포어 기반 코드
Semaphore mutex = 1, rw_mutext = 1;
int read_count = 0;
// writer
while (true) {
wait(rw_mutex);
...
/* writing is performed */
...
signal(rw_mutex);
}
// reader
while (true) {
wait(mutex);
read_count++;
if (read count == 1)
wait(rw_mutex);
signal(mutex);
...
/* reading is performed */
...
wait(mutex);
read_count--;
if (read count == 0)
signal(rw_mutex);
signal(mutex);
}
readcount 로 Reader 수를 관리
- 첫 Reader가 진입 시 Writer를 차단, 마지막 Reader가 나갈 때 Writer 허용
- 여러 Reader는 동시에 읽기 가능 (병렬 허용)
- Writer는 배타적 접근 (하나만 가능)
- Reader가 읽는 동안 Writer는 대기해야 함
- Writer가 쓰는 동안 Reader는 접근 불가