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

→ 여러 개의 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이 발생한다.
→ 하지만 이런 방법들은 Starvation(기아)를 해결하지는 못한다.
→ 모니터 해결책 또한 Starvation(기아)는 해결하지 못한다.
monitor DiningPhilosophers
{
enum {THINKING, HUNGRY, EATING} state[5];
condition self[5]; //Condition Variable
void pickup(int i) {
state[i] = HUNGRY;
test(i);
if (state[i] != EATING)
self[i].wait();
}
void putdown(int i) {
state[i] = THINKING;
test((i + 4) % 5);
test((i + 1) % 5);
}
void test(int i) {
if ((state[(i + 4) % 5] != EATING) &&
(state[i] == HUNGRY) &&
(state[(i + 1) % 5] != EATING)) {
state[i] = EATING;
self[i].signal();
}
}
initialization code() {
for (int i = 0; i < 5; i++)
state[i] = THINKING;
}
}
Mutex locks, Semaphores, Monitors를 이용해 멀티코어 시스템에서 동시에 프로세스를 실행하는 것은 좋은 성능을 보였다.
하지만, 여전히 Race Condition, Deadlock의 가능성이 존재한다.
→ 3가지의 대안이 존재한다.
(동시에 실행해도 문제가 없는 코드)
참고 :
Silberschatz et al. 『Operating System Concepts』. WILEY, 2020.