프로세스 동기화의 대표적인 3가지 문제에 대해 다룸
또 세마포어의 문제점과 모니터에 대해 다룸
Bounded-Buffer Problem(=생성자-소비자 문제)
- Producer(생성자) : 자원을 만드는 역할을 하는 프로세스(빈 버퍼가 자원에 해당됨)
- Consumer(소비자) : 만들어진 자원을 소비하는 역할을 하는 프로세스(꽉 찬 버퍼가 자원에 해당됨)
- Shared date : 여기서의 공유데이터는 버퍼자체 및 버퍼 조작 변수등이 해당됨
- 필요한 세마포어 변수
- mutual exclusion(상호배제) : 바이너리 세마포어가 필요함(공유 데이터의 mutal exclusion을 위해)
- resource count : 정수 세마포어가 필요함(남은 full/empty 버퍼의 수를 표시하기 위해)
Reader-Writers Problem
- reader는 다른 reader의 접근을 허용하기 때문에 지속적으로 reader가 들어오게될 경우 writer는 starvation이 발생 할 수 있음
- writer가 지나치게 오래 기다리지 않도록 일정시간이 지나면 우선순위를 높여 reader가 더 이상 들어오지 못하게 막는 방식으로 해결가능
(멀티 피드백 큐에서 우선순위 boost와 비슷한 아이디어)
Dining-Philosophers Problem
- 철학자는 생각하는 시간, 밥을 먹는 시간 둘 중하나의 상태로 나누어짐
- 철학자가 밥을 먹기위해서 양쪽 젓가락을 사용해야됨
- 공유 데이터 : 젓가락
- 필요한 세마포어 변수 : chopstick[5](젓가락의 배열) 초기값은 1로 채워져있음(젓가락이 1이면 아무도사용x 0이면 누군가가 사용)
-
문제점
- Deadlock의 가능성이 있음
- 모든 철학자가 동시에 배가 고파져 왼쪽 젓가락으 집어서, 사용 못하는 젓가락이 생김
-
해결방법
- 의 철학자만 테이블에 동시에 앉을 수 있도록함
- 락을 두 개 모두 집을 수 있을 때에만 젓가락을 집을 수 있게만듦
- 철학자는 왼쪽 젓가락부터 집도록, 홀수 철학자는 오른쪽 젓가락부터 집도록 정해둠
- 3의 해당하는 부분의 코드화 한것,
- 철학자는 생각, 배고픔, 먹는다의 3개의 상태가있고, 젓가락을 집는 픽업, 먹는 eat, 젓가락을 내려놓는 putdown, 생각하는 think행동이 있음
- 주위 할 점이 self 세마포어는 양쪽 젓가락을 사용할 수 있는지 아닌지에 대한 세마포어로 초기값이 0임 0이면 집을 수 없고, 1이면 집을 수 있음
- putdown : 다른 프로세스를 접근 못하게 락을 걸고 철학자의 상태를 thinking으로 바꾸고, 왼쪽 오른쪽의 철학자에 대해 test함수를 실행후 락을 품
- test : 현재 젓가락을 집을 수 있는지를 테스트하는 함수 왼쪽,오른쪽 철학자가 바을 먹고있지않고, 상태가 배고픈상태면 집을 수 있음(=self값을 1로 만들 수 있음)
- pickup : 락을 걸고 상태를 배고픈 상태로 바꾸고 test를 실행하고 락을 풀고 self의 값을 흭득함(젓가락을 집음)
Monitor
여기서 CV에 해당하는건 full큐(자원이 채워져있는 큐)와 empty큐(자원이 비어져있는큐)로 나타남
생산자는 empty큐에 자원을 넣고 소비자는 full큐에있는 자원을 흭득 그리고 각 프로세스는 entry큐에서 공유 데이터 접근 순서를 정함
Reference
주니온 교수님 유튜브 채널
반효경 교수님 KOCW 운영체제
운영체제 아주 쉬운 세 가지 이야기(OSTEP 번역서)