哲學家進餐問題描述
由dijkstra提出並解決哲學家進餐問題(the dinning philosophers problem)是經典的同步問題。該問題是描述有五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五個碗和五隻筷子,他們的生活方式是交替的進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有他拿到兩隻筷子時才能進餐,進餐完畢繼續進行思考。
1 利用記錄型訊號量解決哲學家進餐問題
經過分析可知,圓桌上的筷子是臨界資源,在一段時間內只允許一位哲學家使用,為了實現筷子的互斥使用,可以使用乙個訊號量表示乙隻筷子,由這五個訊號量構成訊號量陣列。
描述如下:
1 var chopstick:array[0,...,4] of semapthore;
2所有訊號量均被初始化為1,第i位哲學家的活動可描述為:
3repeat
4 wait(chopstick[i]); //
申請乙個臨界資源使用權(獲取左邊的筷子)
5 wait(chopstick[(i+1) mod 5]);//
在申請乙個臨界資源使用權(獲取右邊的筷子)
6...
7 eat //
資源申請成功後進餐操作
8...
9 signal(chopstick[i]); //
釋放乙個臨界資源(放回走手邊筷子)
10 signal(chopstick[(i+1) mod 5]) //
再釋放乙個臨界資源(放回右手邊筷子)
11...
12think
13 until false
但這種方式會引起死鎖,例如:假如五位哲學家同時飢餓,同時拿起左邊的筷子,此時五個訊號量chopstick均為0;當他們試圖拿起右邊的筷子時都將因為沒有筷子而進入無限等待。對於這樣的死鎖問題,可採用以下幾種解決辦法。
(1) 至多只允許有四位哲學家同時去拿左邊的筷子,最終能保證至少有一位哲學家能夠 進餐,並在用畢時能釋放出他用過的兩隻筷子,從而使更多的哲學家能夠進餐。
(2) 僅當哲學家的左、右兩隻筷子均可用時,才允許他拿起筷子進餐。
(3) 規定奇數號哲學家先拿他左邊的筷子,然後再去拿右邊的筷子,而偶數號哲學家則 相反。按此規定,將是 1、2 號哲學家競爭 1 號筷子;3、4 號哲學家競爭 3 號筷子。即五位 哲學家都先競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有一位哲學家能獲 得兩隻筷子而進餐。
2.利用 and 訊號量機制解決哲學家進餐問題
在哲學家進餐問題中,要求每個哲學家先獲得兩個臨界資源(筷子)後方能進餐,這在本 質上就是前面所介紹的 and 同步問題,故用 and 訊號量機制可獲得最簡潔的解法。
描述如下
1 var chopstick array of semapthore:=(1,1,1,1,1);2processi
3repeat
4think;
5 sswait(chopstick[(i+1) mod 5
],chopstick[i]);
6eat
7 ssignal(chopstick[(i+1) mod 5
],chopstick[i]);
8 until false;
經典程序同步問題 哲學家進餐
問題描述 一張圓桌上坐著5名哲學家,每兩名哲學家之間的桌上擺著一根筷子,兩根筷子中間是一碗公尺飯,如圖所示 圖來自於王道作業系統課本 哲學家只會思考和進餐,哲學家在思考時,並不影響其他人。只有當哲學家飢餓時,才試圖拿起左 右兩根筷子 一根一根拿起 若筷子在其他人手上,則需等待。飢餓的哲學家只有同時拿...
經典程序同步問題 哲學家進餐問題
五個哲學家公用一張圓桌,分別坐在周圍的五張桌子上,在圓桌上有五個碗和五隻筷子交叉排列,它們的生活方式是交替的進行思考和進餐.哲學家進行思考時不用筷子,飢餓時取乙隻他兩邊的任意乙隻筷子 預設取左邊的筷子,沒有時取右邊的,都沒有時就取不了 當他有兩隻筷子時就能進餐.進餐後,放下筷子繼續思考.若只有乙隻筷...
程序同步 互斥 哲學家進餐問題
1 問題描述 一張圓桌上有5名哲學家,沒兩個哲學家之間有一根筷子,桌子中間由一碗公尺飯。當哲學家飢餓時會試圖分別拿起左右兩根筷子,如果筷子已在他人手上則需等待。飢餓的哲學家只有拿起兩根筷子才能進餐,吃完後才能放下筷子。2 問題分析 對哲學家分別編號0,1,2,3,4,對筷子編號0,1,2,3,4。i...