經典程序同步問題 哲學家進餐

2021-10-10 10:26:37 字數 1129 閱讀 5543

問題描述:一張圓桌上坐著5名哲學家,每兩名哲學家之間的桌上擺著一根筷子,兩根筷子中間是一碗公尺飯,如圖所示(圖來自於王道作業系統課本)。哲學家只會思考和進餐,哲學家在思考時,並不影響其他人。只有當哲學家飢餓時,才試圖拿起左、右兩根筷子(一根一根拿起)。若筷子在其他人手上,則需等待。飢餓的哲學家只有同時拿起兩根筷子才可以開始進餐,進餐完畢後,放下筷子繼續思考。

問題分析

關係分析。5名哲學家與左右鄰居對其中間的筷子是互斥的,因為我拿了,你就沒有辦法拿,中間筷子只有一根。

整理思路。這個問題的關鍵是如何讓一名哲學家拿到左右兩根筷子而不造成死鎖或飢餓的現象(死鎖在另一文)。解決方法有兩個:一是讓他們同時拿兩根筷子;二是對每名哲學家的動作制定規則,避免飢餓或死鎖現象的發生。

訊號量設定。定義互斥訊號量陣列chopstick[5]=,用於對5根筷子的互斥訪問。哲學家按順序編號0~4,哲學家i左邊筷子的編號為i,哲學家右邊筷子的編號為(i+1)%5。**描述如下:

semaphore chopstick[5]=  

pi()while

(1);  

}  這個演算法存在一些問題:當5名哲學家都想要進餐時,執行了第乙個p操作,那麼筷子就已經全部被拿光了,這樣就無法執行第二個p操作,那麼程序全部被阻塞,因此出現了死鎖。

為了防止上述情況的發生,可對哲學家加一些限制條件,比如至多允許4名哲學家進餐;僅當一名哲學家左右兩邊筷子都可用時,才允許他抓起筷子;對哲學家順序編號,要求奇數號哲學家先拿起左邊的筷子,然後再拿起右邊的筷子,偶數號則相反。

制定的正確規則如下:假設採用第二種方法,當一名哲學家左右兩邊的筷子都可用時,才允許他抓起筷子。

semaphore chopstick[5]=

//初始化訊號量

semaphore mutex=1; 

//設定取筷子的訊號量

pi()while

(1);  

}  此外,還可以採用and訊號量機制來解決哲學家進餐問題,下次學習了開一篇文字進行**。

經典程序同步問題 哲學家進餐問題

五個哲學家公用一張圓桌,分別坐在周圍的五張桌子上,在圓桌上有五個碗和五隻筷子交叉排列,它們的生活方式是交替的進行思考和進餐.哲學家進行思考時不用筷子,飢餓時取乙隻他兩邊的任意乙隻筷子 預設取左邊的筷子,沒有時取右邊的,都沒有時就取不了 當他有兩隻筷子時就能進餐.進餐後,放下筷子繼續思考.若只有乙隻筷...

程序同步 互斥 哲學家進餐問題

1 問題描述 一張圓桌上有5名哲學家,沒兩個哲學家之間有一根筷子,桌子中間由一碗公尺飯。當哲學家飢餓時會試圖分別拿起左右兩根筷子,如果筷子已在他人手上則需等待。飢餓的哲學家只有拿起兩根筷子才能進餐,吃完後才能放下筷子。2 問題分析 對哲學家分別編號0,1,2,3,4,對筷子編號0,1,2,3,4。i...

經典程序的同步問題之 哲學家進餐

哲學家進餐問題描述 由dijkstra提出並解決哲學家進餐問題 the dinning philosophers problem 是經典的同步問題。該問題是描述有五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五個碗和五隻筷子,他們的生活方式是交替的進行思考和進餐。平時,乙個哲學家進行思...