Dining-Philosophers Problem

다섯 명의 철학자가 원탁에 앉아 있고, 각자의 앞에는 음식과 양옆에 포크가 하나씩 있다.

→ 여러 개의 Resources가 Process들 사이에 공유된다.

→ **Deadlock, Starvation(기아)**가 발생할 수 있다.

간단한 해결 방법

semaphore chopstick[5];

while (true) {
  wait(chopstick[i]);
  wait(chopstick[(i+1) % 5]); //두개씩 집는다.
  ...
  /* eat for a while */
  ...
  signal(chopstick[i]);
  signal(chopstick[(i+1) % 5]); //젓가락을 내려놓는다.
  ...
  /* think for awhile */
  ...
}

세마포어를 이용해 상호배제 문제를 해결했지만,

**Deadlock, Starvation(기아)**가 발생한다.

→ 만약 5명의 철학자가 동시에 배가 고파졌다. 5명이 왼쪽의 젓가락을 동시에 집고 오른쪽 젓가락을 집으려고 하면…?? ⇒ 젓가락이 없어서 Deadlock이 발생한다.

Deadlock에 대한 해결책

  1. 4명의 철학자만 테이블에 동시에 앉을 수 있도록 한다.
  2. 왼쪽과 오른쪽 젓가락을 모두 사용할 수 있는 경우에만 젓가락을 집을 수 있게 한다.
  3. 짝수 번째 철학자들은 자신의 왼쪽에 있는 젓가락부터, 홀수 번째 철학자들은 자신의 오른쪽에 있는 젓가락부터 집어 들도록 한다.