Bounded-Buffer Problem(Producer-Consumer Problem)
- Shared Data
- Buffer 자체 및 Buffer 조작 변수(empty / full beffer의 시작 위치)
- Synchronization variables
- mutual exclusion
- Need binary semaphore(shared data의 mutual exclusion을 위해)
- resouce count
- Need integer semaphore(남은 full / empty buffer의 수 표시)
해결
Readers-Writers Problem
- 한 process가 DB에 write 중 일 때 다른 process가 접근하면 안됨
- read는 동시에 여럿이 해도 됨
- solution
- Writer가 DB에 접근 허가를 아직 못한 상태에서는 모든 대기중인 Reader들을 다 DB에 접근하게 해준다.
- Writer는 대기 중인 Reader가 하나도 없을 때 DB 접근이 허용된다.
- 일단 Writer가 DB에 접근 중이면 Reader들은 접근이 금지된다.
- Writer가 DB에서 빠져나가야만 Reader의 접근이 허용된다.
- Shared data
- Synchronization variables
- mutex
- 공유 변수 Read Count를 접근하는 코드(Critical Section)의 Mutual Exclusion 보장을 위해 사용
- DB
- Reader와 Writer가 공유 DB 자체를 올바르게 접근하게 하는 역할
해결
- Reader가 지속적으로 들어 올 경우 Writer는 기아 현상을 겪을 수 있음.
Dining-Philosophers Problem
문제점
- DeadLock 가능성이 있다.
- 모든 철학자가 동시에 배가 고파져 왼쪽 젓가락을 드는 경우
해결
- 4명의 철학자만이 테이블에 도이에 앉을 수 있게 한다.
- 젓가락을 두 개 모두 잡을 수 있을 때에만 젓가락을 잡을 수 있게 한다.
- 비대칭
- 짝수(홀수) 철학자는 왼쪽(오른쪽) 젓가락부터 잡도록 한다.
- 2번째 방법으로 해결한 코드
Monitor
- Semaphore의 문제점
- 코딩하기 힘들다
- 정확성(correctness)의 입증이 어렵다
- 자발적 협력(voluntary cooperation)이 필요하다
- 한번의 실수가 모든 시스템에 치명적 영향
- 동시 수행중인 프로세스 사이에서 abstact data type의 안전한 공유를 보장하기 위한 high-level synchronization construct
monitor monitor-name {
shared variable declarations
procedure body P1(...) {
...
}
procedure body P2(...) {
...
}
procedure body Pn(...) {
...
}
{
initialization code
}
- 모니터 내에서는 한번에 하나의 프로세스만이 활동 가능
- 프로그래머가 동기화 제약 조건을 명시적으로 코딩할 필요 없음
- 프로세스가 모니터 안에서 기다릴 수 있도록 하기 위해 condition variable 사용
- Condition variable은 wait와 signal 연산에 의해서만 접근 가능
- wait를 invoke한 프로세스는 다른 프로세스가 signal을 invoke하기 전 까지 suspend된다.
- signal은 정확하게 하나의 suspend된 프로세스를 resume 한다. suspend된 프로세스가 없으면 아무 일도 일어나지 않는다.
Monitor를 활용해 Bounded-Buffer Problem 해결
출처 : http://www.kocw.net/home/cview.do?lid=c5e572cd1319ca6b