OS學習筆記 哲學家進餐問題

2021-08-13 09:00:50 字數 844 閱讀 5459



問題可以描述為:五個哲學家一生都在思考和進餐中度過。吃飯的時候必須拿起兩側的筷子,吃完就放下。是否能編寫程式且不產生死鎖?

最直接的解法

int n = 5;

philosopher(int i)

}但是這種解法中,如果五位哲學家同時拿起左筷子,每個人都在等待右邊的人吃完放下筷子給自己,這種狀態僵持下去,導致長期飢餓。

使用乙個互斥訊號量對呼叫thinking之後的五個語句進行保護。在開始拿筷子之前,哲學家i對互斥訊號量mutex執行p操作,這樣等他拿起i號筷子時,其他哲學家將不能同時拿任何一根筷子。此時該哲學家試圖拿起第i+1號筷子,如果該筷子空閒,i號哲學家就拿起它進餐,進餐完畢放下兩根筷子並執行v操作。這種方法雖然避免了死鎖和飢餓,但併發度很低,乙個時刻只允許乙個哲學家進餐。實際上五個筷子可以最多保證兩個哲學家進餐。

再使用乙個陣列state來跟蹤每個哲學家的當前狀態(思考進餐或飢餓)

**如下:

int n = 5;

int left = i ,right = (i+1)%n;//左右鄰居的編號

int thinking = 0,hungry = 1,eating = 2;

int state[n];

semaphore mutex = 1;//互斥訊號量

semaphore s[n];//s[i]是哲學家i對應的訊號量

philosopher(int i)

|take_chop(int i)

put_chop(int i)

test(int i)}



哲學家進餐問題

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

哲學家進餐問題

一張圓桌上坐著5名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一碗公尺飯,如圖所示。哲學家們傾注畢生精力用於思考和進餐,哲學家在思考時,並不影響他人。只有當哲學家飢餓的時候,才試圖拿起左 右兩根筷子 一根一根地拿起 如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿到了兩根筷子才可以開...

哲學家進餐問題

哲學家進餐問題 五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考 分析 放在桌子上的筷子是臨界資源,在一段時間內...