Process Synchronization (2)
Classical Problems of Synchronization
Bounded-Buffer Problem(Producer-Consumer Problem)
-
Shared data
-
Synchronizaiton variables
- mutual exclusion: Need binary semaphore(Shared data의 mutual exclusion을 위해)
- resource count: Need integer semaphore(남은 full/empty buffer의 수 표시)
Readers-Writers Problem
- 한 프로세스가 Database에 write 중일 때 다른 프로세스가 접근하면 안 됨
- read는 동시에 여럿이 해도 됨
- 해결책
- Writer가 DB에 접근 허가를 아직 얻지 못한 상태에서는 모든 대기 중인 Reader들은 다 DB에 접근 가능케 해줌
- Writer는 대기 중인 Reader가 하나도 없을 때 DB 접근이 허용
- 일단 Writer가 DB에 접근 중이면 Reader들은 접근이 금지
- Writer가 DB에서 빠져나가야만 Reader의 접근 허용
-
Shared data
- Database 자체
- int readcount; //(현재 DB에 접근 중인 Reader의 수)
-
Synchronization variables
- mutex: 공유 변수 readcount를 접근하는 critical section의 mutual exclusion을 보장하기 위해 사용
- db: Reader와 Writer가 공유 DB 자체를 올바르게 접근 하는 역할
- 최초의 Reader는 readcount를 증가시켜주어, db에 lock을 걸어줌
- readcount 자체도 공유 변수이기 때문에 Semaphore 사용하여, Lock/Unlock 처리를 해줌
- readcount가 0이 되는 경우, db에 건 lock을 unlock 해주며 Reader 마무리
- 너무 늦게 들어온 Reader보다 Writer가 우선순위 높게 하는 방식 등으로 Starvation 문제 해결 가능할 것
Dining Philosophers Problem
-
Problem
- 모든 철학자가 동시에 왼쪽 젓가락을 집어버리면 Deadlock이 생김
-
Solution
- 4명의 철학자만이 테이블이 동시에 앉을 수 있도록 함
- 젓가락을 두 개 모두 집을 수 있을 때에만 젓가락을 집을 수 있게 함(좌/우측 철학자가 식사 중이 아닐 때, 내가 젓가락을 들 수 있음)
- 비대칭
- 짝수 철학자는 왼쪽 젓가락부터 잡음
- 홀수 철학자는 오른쪽 젓가락부터 잡음
Monitor
- Semaphore의 문제점
- 코딩의 어려움
- 정확성의 입증이 어려움
- 자발적 협력이 필요
- 한 번의 실수가 모든 시스템에 치명적 영향
- Monitor: 동시 수행 중인 프로세스 사이에서 추상 데이터 타입의 안전한 공유를 보장하기 위한 high-level synchronization construct
- Monitor 내부에 공유 데이터를 두고, 하나의 프로세스 씩 동작하게 하는 식으로 진행
- 프로그래머가 동기화 제약 조건을 명시적으로 코딩 할 필요가 없음
- 프로세스가 모니터 안에서 기다릴 수 있도록 condition variable 사용
- Condition variable은 _wait_와 signal 연산에 의해서만 접근 가능
- signal을 사용할 때 suspend 상태인 프로세스가 없는 경우, 아무 일도 일어나지 않음
- Monitor를 이용한 Dining Philosophers 문제의 해결
- 상대의 state를 변경할 수 있기에 공유 변수 처리