CS/OS

식사하는 철학자 문제

우봉수 2023. 4. 11. 10:42

<운영체제에서의 고전적인 동기화 문제>

식탁에 생각하고 먹으면서 생애를 보내는 철학자 5명이 둘려 앉고 

가운데에 음식이 있고 젓가락의 갯수는 철학자의 수와 동일하다. 

철학자는 음식을 집어 먹기 위해서는 젓가락 2개를 잡아야 한다.

+ 이미 옆 사람 손에 들어간 젓가락을 집을 수는 없다.

 

RICE: 공유 자원

철학자: 프로세스

밥을 먹는 것: 작업을 하기 위해 필요한 공유 자원을 이용하는 행위

젓가락: 세마포

밥을 먹지 못해 굶어 죽는 것: 기아

 

+& 세마포란?

  • 세마포어(Semaphore)는 상호 배제, 동기화, 임계 영역 등 다중 프로세스 간 동기화 문제를 해결하기 위해 사용되는 동기화 도구를 말한다.
  • 세마포어는 wait()과 signal()이라는 두 개의 연산으로 이루어져 있으며 wait() 연산은 세마포어 값을 감소시키고, 값이 0보다 작아지면 해당 프로세스는 블록된다. signal() 연산은 세마포어 값을 증가시키고, 이를 기다리는 다른 프로세스가 있다면 하나를 깨우게 된다.

 

문제점: 만약 모든 철학자가 배가고파 자기 오른쪽에 있는 젓가락을 집는다면 모두가 밥을 먹지 못 하고 기다려야 하는 (교착 상태)상황이 일어나게 된다. 

 

<해결법>

  1. 철학자의 수를 줄인다 (프로세스의 수 감소)
  2. 한 철학자가 젓가락 두 개를 모두 집을 수 있을 때만 젓가락을 집도록 허용한다. (임계구역 안에서만 작업 - 모니터)
  3. 비대칭 해결안: 홀수 번호의 철학자는 왼쪽 젓가락 먼저 집고 짝수 번호의 철학자는 오른쪽 젓가락을 먼져 집도록 하여 모두가 젓가락을 하나씩만 잡은 상황을 방지한다. (알고리즘 적 해결)