6. Producer/Consumer problem (1) - semaphore/monitor
in CS on OS
Producer / Consumer problem ?
- 하나 이상의 Producer가 데이터를 생성하고 버퍼에 넣음
- 하나의 Consumer가 버퍼로부터 데이터를 가져와서 소비함
- 한번에 하나의 Producer 또는 Consumer만 버퍼에 접근이 가능함 (race condition이 가능하기 때문에)
- 문제점?
- Producer가 이미 다 찬 버퍼에 데이터를 삽입하지 않도록 보장해야 함
- Consumer는 빈 버퍼로부터 데이터를 가져오는 요청을 하지 않도록 보장해야 함
- semaphore를 이용하여 이런 상황에서의 synchronization 또한 가능함
가능한 시나리오
Semaphore를 내부적으로 어떻게 구현하냐?
- 하드웨어적으로 구현하는 것은 불가능
- 소프트웨어적으로 데커, 피터슨 알고리즘 있음
- atomic instruction으로도 구현 가능하지만 busy waiting의 한계를 벗어나지 못함
Monitor?
- Motivation
- Semaphore를 이용하여 크리티컬 섹션을 보호하기가 쉽지 않음
semWait
, semSignal
함수들이 여기저기 흩어져 있으면 무튼 어려움..
- Semaphore와 동일한 기능을 제공하지만 컨트롤이 쉬운 자료형
- 프로세스 간의 Mutual exclusion, Synchronization을 보다 쉽게, 직관적으로 만듬
- 여러 개의 프로시져, 초기화 코드, 로컬 데이터로 구성됨
- 로컬 데이터는 Monitor의 프로시져만 접근 가능함
- 프로세스가 모니터에 진입하기 위해선 모니터의 프로시져를 호출해야 함
- Condition variable
cwait(c)
: 호출하는 프로세스를 condition "c"
에서 대기하도록 함csignal(c)
: condition "c"
에서 블락된 프로세스의 실행을 재개함