作業系統 哲學家進餐問題

2021-10-09 10:42:46 字數 1205 閱讀 7231

一張圓桌上坐著5名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一火鍋。哲學家們有思考和進餐兩個動作,哲學家在思考時,並不影響他人。只有當哲學家飢餓時,才試圖拿起左、右兩根筷子(一根一根地拿起)。如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿起兩根筷子才可以開始進餐,當進餐完畢後,放下筷子繼續思考。

源於網路,侵則刪。

分析:

5位哲學家,對應是5個程序,當然也可以更多了,為了方便分析我們假設為5,每只筷子都是臨界資源。每位哲學家需要獲得兩隻筷子(兩個臨界資源)才能進餐。左右相鄰的哲學家對中間的筷子訪問應該是互斥的。

定義互斥訊號量陣列chopstick[5]= 用於實現對5個筷子的互斥訪問。並對哲學家與筷子進餐編號。

semaphore chopstick[5]

=;voidpi(

)}

上述可能會產生死鎖,假設5位哲學家同時想進餐,依次拿起自己左邊的筷子,當想拿起右邊的筷子時,發現右邊的筷子都被拿起了,5個chopsticks都為0,陷入了無限等待。

至多只允許有4位哲學家同時去拿左邊的筷子,最終能保證至少有以為哲學家能進餐,並在用完後釋放他用過的兩隻筷子,從而是更多的哲學家能夠進餐。可以設定count訊號量,初始值為4,只允許4位哲學家,保證至少有1位哲學家能進餐。

semaphore chopstick[5]

=;semaphore count=4;

voidpi(

)}

僅僅當哲學家的左右兩隻筷子均可用時,才允許他拿起筷子。

semaphore chopstick[5]

=;semaphore mutex 1

;voidpi(

)}

要求奇數號哲學家先拿左邊的筷子,然後再拿右邊的筷子,而偶數號哲學家剛好相反。用這種方法可以保證如果相鄰的兩個奇偶號哲學家都想吃飯,那麼只會有其中乙個可以拿起第一只筷子,另乙個會直接阻塞。這就避免了占有一支後再等待另乙隻的情況。

semaphore chopstick[5]

=;voidpi(

int i)

else

}}

作業系統中哲學家進餐問題

哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...

哲學家進餐c 作業系統

這是哲學家進餐問題的c 程式,這裡使用的進餐方式是只有當哲學家左右兩邊都有可用筷子時才可以進餐,如果只有乙隻左手筷子放下自己左手筷子。如果對其中函式有不理解的可以看我另一篇部落格程序相關函式彙總解釋,對照著看,可能方便你理解 include include include using namespa...

哲學家進餐問題

哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...