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

2022-08-05 08:21:12 字數 1718 閱讀 3559

哲學家進餐問題描述

由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);2

processi

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...