CS/OS
식사하는 철학자 문제
우봉수
2023. 4. 11. 10:42
<운영체제에서의 고전적인 동기화 문제>
식탁에 생각하고 먹으면서 생애를 보내는 철학자 5명이 둘려 앉고
가운데에 음식이 있고 젓가락의 갯수는 철학자의 수와 동일하다.
철학자는 음식을 집어 먹기 위해서는 젓가락 2개를 잡아야 한다.
+ 이미 옆 사람 손에 들어간 젓가락을 집을 수는 없다.
RICE: 공유 자원
철학자: 프로세스
밥을 먹는 것: 작업을 하기 위해 필요한 공유 자원을 이용하는 행위
젓가락: 세마포
밥을 먹지 못해 굶어 죽는 것: 기아
+& 세마포란?
- 세마포어(Semaphore)는 상호 배제, 동기화, 임계 영역 등 다중 프로세스 간 동기화 문제를 해결하기 위해 사용되는 동기화 도구를 말한다.
- 세마포어는 wait()과 signal()이라는 두 개의 연산으로 이루어져 있으며 wait() 연산은 세마포어 값을 감소시키고, 값이 0보다 작아지면 해당 프로세스는 블록된다. signal() 연산은 세마포어 값을 증가시키고, 이를 기다리는 다른 프로세스가 있다면 하나를 깨우게 된다.
문제점: 만약 모든 철학자가 배가고파 자기 오른쪽에 있는 젓가락을 집는다면 모두가 밥을 먹지 못 하고 기다려야 하는 (교착 상태)상황이 일어나게 된다.
<해결법>
- 철학자의 수를 줄인다 (프로세스의 수 감소)
- 한 철학자가 젓가락 두 개를 모두 집을 수 있을 때만 젓가락을 집도록 허용한다. (임계구역 안에서만 작업 - 모니터)
- 비대칭 해결안: 홀수 번호의 철학자는 왼쪽 젓가락 먼저 집고 짝수 번호의 철학자는 오른쪽 젓가락을 먼져 집도록 하여 모두가 젓가락을 하나씩만 잡은 상황을 방지한다. (알고리즘 적 해결)