**:
哲學家進餐問題:
(一)問題:
5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。
規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。
(二)分析:
每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。
semaphore stcik[5]=
因為:只有占有左邊筷子-》占有右邊筷子-》吃飯
所以p(左邊筷子)-》p(右邊筷子)-》吃飯
(三)實現:
main()
philosopher(int i)
}(四)問題:
如果5個哲學家同時拿起自己左邊的筷子,就會發生死鎖。
(五)防止死鎖的方法:
(1)方法一:
規定在拿到左側的筷子後,先檢查右面的筷子是否可用。如果不可用,則先放下左側筷子, 等一段時間再重複整個過程。
問題:發生飢餓現象;
如果同時拿起左邊筷子,則右邊的筷子都不可用,則放下,然後再次拿起,。。。,則誰都無法就餐,
偽碼:
semaphore chopstick[5]=;
semaphore room=4;
void philosopher(int i) }
(3)將拿左筷子,與拿右筷子當做乙個原子操作:(即只有當左右筷子均可以拿到時,才拿筷子。)
方法一:
利用and 型訊號量機制實現:根據課程講述,在乙個原語中,將一段**同時需
要的多個臨界資源,要麼全部分配給它,要麼乙個都不分配,因此不會出現死鎖的情形。
偽碼:
semaphore chopstick[5]=;
void philosopher(int i) }
方法二:
利用訊號量的保護機制實現。通過訊號量mutex對eat()之前的取左側和右側筷
子的操作進行保護,使之成為乙個原子操作,這樣可以防止死鎖的出現。
偽碼:
semaphore mutex = 1 ;
semaphore chopstick[5]=;
void philosopher(int i) }
(4)規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號 的哲學家則相反。
偽碼:
semaphore chopstick[5]=;
void philosopher(int i)
else //奇數哲學家,先左後右。 }
作業系統 哲學家進餐問題
一張圓桌上坐著5名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一火鍋。哲學家們有思考和進餐兩個動作,哲學家在思考時,並不影響他人。只有當哲學家飢餓時,才試圖拿起左 右兩根筷子 一根一根地拿起 如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿起兩根筷子才可以開始進餐,當進餐完畢後,放下...
哲學家進餐c 作業系統
這是哲學家進餐問題的c 程式,這裡使用的進餐方式是只有當哲學家左右兩邊都有可用筷子時才可以進餐,如果只有乙隻左手筷子放下自己左手筷子。如果對其中函式有不理解的可以看我另一篇部落格程序相關函式彙總解釋,對照著看,可能方便你理解 include include include using namespa...
哲學家進餐問題
哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...