(操作系統原理·第三章)五個哲學家喫通心麪 問題

問題描述:

有五個哲學家圍坐在一圓桌旁,桌子中央有一盤通心麪,每人面前有一隻空盤子,每兩人之間放一把叉子。爲了吃麪,每個哲學家必須獲得兩把叉子,且每人只能直接從自己左邊或右邊去取叉子。

分析:

在這道經典題目中,每一把叉子都是必須互斥使用的,因此,應爲每把叉子設置一個互斥信號量Si (i=0,1,2,3,4),初值均爲1。當一個哲學家喫通心麪之前必須獲得自己左邊和右邊的兩把叉子,即執行兩個P 操作,喫完通心麪後必須放下叉子,即執行兩個V 操作。

算法:

var forki :array[0..4] of semaphore;
forki := 1;
cobegin
process Pi // i=0,1,2,3,4
begin
L1:
思考;
P(fork[i]);
P(fork[i+1] mod 5);
喫通心麪;
V(fork[i]);
V(fork[i+1] mod 5);
goto L1;
end;
coend.

上述解法中,如果第五個哲學家先執行P(fork[4]),再執行P(fork[0])的話,就有可能出現每個哲學家舉起右邊一把叉子,卻又在永遠等待相鄰哲學家手中的叉子的情況。
有若干種辦法可避免這類死鎖:
  1.至多允許四個哲學家同時喫。
  2. 奇數號先取左手邊的叉子,然後再取右手邊的叉子;偶數號先取右手邊的叉子,然後,再取左手邊的叉子。
  3. 每個哲學家取到手邊的兩把叉子才喫,否則,一把叉子也不取。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章