哲學家進餐問題:有五個哲學家,她們的生活方式是交替地進行思考和進餐。哲學家們共用一張園桌,分別坐在周圍五張椅子上。在圓桌上有五個碗和五支筷子,平時乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩支筷子時才能進餐。程序畢,放下筷子又繼續思考。
分析:筷子是臨界資源,在一段時間內只允許乙個哲學家使用。(有臨界資源就存在互斥)。用乙個訊號量表示一支筷子,由這五個訊號量構成訊號量組。
var chopstick : array[0...4] of semaphore(訊號量型) 所有訊號量被初始化為1
用記錄型訊號量解決哲學家進餐問題:
第i個哲學家的活動描述為:
repeat
wait(chopstick[i]);
wait(chopstick[i+1 mod 5]);
... eat ...
signal(chopstick[i]);
signal(chopstick[i+1 mod 5]);
...
think;
until false;
問題:假如五個哲學家同時飢餓而各自拿起左邊的筷子,會使五個訊號量均為0,當他們再試圖拿起右邊筷子時,都將無限期地等待。
解決方式:(1)至多四個人同時拿左邊的筷子,保證至少乙個人可以進餐,最終釋放筷子使更多的人進餐。(2)僅當哲學家的左右兩支筷子均可用時,才允許他拿起筷子進餐。(3)規定奇數號哲學家先拿起其左邊的筷子,再拿右邊的筷子,偶數號哲學家則相反。即1、2號人競爭1號筷子,3、4號人競爭3號筷子,即五個人都先競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有某乙個程序。
用and型訊號量解決哲學家進餐問題:
var chopstick : array[0...4] of semaphore := (1,1,1,1,1)
(and型是在執行wait語句時,要麼全給資源,要麼不給)
repeat think;
swait(chopstick[(i+1) mod 5], chopstick[i]);//同時申請
eat;
ssignal(chopstick[(i+1) mod 5], chopstick[i]);//同時釋放,原語操作,不允許中斷
think;
until false;
程序同步 互斥 哲學家進餐問題
1 問題描述 一張圓桌上有5名哲學家,沒兩個哲學家之間有一根筷子,桌子中間由一碗公尺飯。當哲學家飢餓時會試圖分別拿起左右兩根筷子,如果筷子已在他人手上則需等待。飢餓的哲學家只有拿起兩根筷子才能進餐,吃完後才能放下筷子。2 問題分析 對哲學家分別編號0,1,2,3,4,對筷子編號0,1,2,3,4。i...
經典程序同步問題 哲學家進餐
問題描述 一張圓桌上坐著5名哲學家,每兩名哲學家之間的桌上擺著一根筷子,兩根筷子中間是一碗公尺飯,如圖所示 圖來自於王道作業系統課本 哲學家只會思考和進餐,哲學家在思考時,並不影響其他人。只有當哲學家飢餓時,才試圖拿起左 右兩根筷子 一根一根拿起 若筷子在其他人手上,則需等待。飢餓的哲學家只有同時拿...
作業系統學習 5 程序同步
這一篇部落格主要學習程序同步的知識。程序同步的主要任務是對多個相關程序在執行次序上進行協調,以使併發執行的諸程序之間能有效地共享資源和相互合作,從而使程式的執行具有可再現性。在多道程式環境下,當程式併發執行時,由於資源共享和程序合作,使同處於乙個系統中的諸程序之間可能存在著以下兩種形式的制約關係 間...