Dining-Philosopher 's Monitor 솔루션 :`pickup (i)`이`self [i] .signal() '을 간접적으로 호출해야합니까? 운영 체제의 개념에서
5.8.2 식사하는 철학자 솔루션 사용하여 모니터
다음으로, 우리는 식사하는 철학자 문제에 교착없는 솔루션을 제시하여 모니터의 개념을 설명. 이 솔루션은 중 하나만 사용할 수있는 경우에만 철학자가 그녀의 젓가락을 집어들 수 있다는 제한을 적용합니다 ( ). 이 솔루션을 코딩하려면 우리는 철학자를 찾을 수있는 세 가지 상태 중 을 구별해야합니다. 그녀의 두 이웃 식사를하지 않는 경우에만 내가 변수
state[i] = EATING
를 설정할 수 있습니다enum {THINKING, HUNGRY, EATING} state[5];
철학자 :
(state[(i+4) % 5] != EATING)
및(state[(i+1) % 5] != EATING)
을이 목적을 위해, 우리는 다음과 같은 데이터 구조를 소개합니다.우리는 또한이 그녀가 배고파 그러나 그녀가 필요로하는 젓가락을 얻을 수없는 때 내가 자신을 지연 철학자 할 수
condition self[5];
선언해야합니다.
monitor DiningPhilosophers { enum {THINKING, HUNGRY, EATING} state[5]; condition self[5]; 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; } }
그림 5.18 식당 철학자 문제에 대한 모니터 솔루션.
각 철학자는 먹기 시작하기 전에 작업을 호출해야합니다.
pickup()
. 이 행위는 철학자 과정의 정지를 초래할 수 있습니다. 수술이 성공적으로 완료되면 철학자가 식사를 할 수 있습니다. 그런 다음 철학자가putdown()
작업을 호출합니다. 조건이 충분 때 회전에self[i].signal()
를 호출DiningPhilosophers.pickup(i); ... eat ... DiningPhilosophers.putdown(i);
pickup(i)
전화 test(i)
. pickup(i)
은 self[i].signal()
을 간접적으로 호출해야합니까?
감사합니다.
아니요 신호가 손실되었지만 ** putdown (i)에서 중요합니다 ** – yakout