哲學家進餐是作業系統課程的典型pv操作問題。通過此問題學習:
1.熟悉linux平台的基本程式設計
2.在linux平台上通過系統呼叫使用執行緒、互斥量機制以及訊號量機制等進行程式設計
內容:在unix系統下實現哲學家就餐問題:要求顯示出每個哲學家的工作狀態,如吃飯,思考;連續執行30次以上都未出現死鎖現象。
由dijkstra提出並解決的哲學家進餐問題(the dinning philosophers problem)是典型的同步問題。該問題是描述有五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在圓桌上有五個碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐完畢,放下筷子繼續思考。
放在桌子上的筷子是臨界資源,在一段時間內只允許一位哲學家使用,為了實現對筷子的互斥訪問,可以用乙個訊號量表示筷子,由這五個訊號量構成訊號量陣列。
下面展示一些內聯**片
。
semaphore chopstick[5] = ;
while(true)
上述的**可以保證不會有兩個相鄰的哲學家同時進餐,但卻可能引起死鎖的情況。假如五位哲學家同時飢餓而都拿起的左邊的筷子,就會使五個訊號量chopstick都為0,當他們試圖去拿右手邊的筷子時,都將無筷子而陷入無限期的等待。
拿起拿起筷子操作導致死鎖的原因:
預防死鎖的實現方法1:破壞「請求和保持條件」(作為參考,不以此實現)
任務如果無法同時拿起兩支筷子,則放下已經拿起的筷子,等待一段時間再嘗試
利用posix api中的非阻塞操作實現對能否拿起筷子的判斷
pthread_mutex_trylock操作(非阻塞加鎖)
sem_trywait操作(非阻塞p操作)
xsi訊號量集中設定ipc_nowait引數(非阻塞v操作)
預防死鎖的實現方法2:破壞「迴圈等待條件」
對哲學家編號,奇偶號哲學家拿起筷子的順序不同
避免死鎖的實現方法
再建立乙個任務,哲學家拿起筷子時向該任務發起申請,由該任務對當前筷子的分配情況進行判斷,判定系統是否由安全狀態向不安全狀態轉換,從而允許或拒絕該次申請
拿起筷子和放下筷子的操作如何實現:
筷子是臨界資源,拿起筷子操作就哲學家(不同任務)之間是對臨界資源的互斥訪問,放下筷子就是對臨界資源的釋放,在linux中可以通過多種機制來實現:
互斥量(加鎖,解鎖),適用於執行緒
posix訊號量(p操作,v操作),無名訊號量適用於執行緒,命名訊號量適用於程序/執行緒
xsi訊號量集(p操作,v操作),同時適用於程序與執行緒。
策略一主線程
哲學家進餐執行緒
部分結果展示
策略二至多只允許四個哲學家同時進餐,以保證至少有乙個哲學家能夠進餐,最終總會釋放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。定義訊號量count,只允許4個哲學家同時進餐,這樣就能保證至少有乙個哲學家可以就餐。
主線程
哲學家進餐程序
部分結果展示
PV操作經典例題 哲學家進餐問題
哲學家進餐問題 五個哲學家共用一張圓桌,分別坐在周圍的五張椅子上,在桌子上有五隻碗和五隻筷子,他們的生活方式是交替地進行思考和進餐。平時,乙個哲學家進行思考,飢餓時便試圖取用其左右最靠近他的筷子,只有在他拿到兩隻筷子時才能進餐。進餐畢,放下筷子繼續思考。分析 放在桌子上的筷子是臨界資源,在一段時間內...
哲學家進餐問題
哲學家進餐問題 一 問題 5個哲學家圍坐在乙個圓桌上,每兩個哲學家之間都有乙隻筷子,哲學家平時進行思考,只有當他們飢餓時,才拿起筷子吃飯。規定每個哲學家只能先取其左邊筷子,然後取其右邊筷子,然後才可以吃飯。二 分析 每乙隻筷子都是乙個臨界資源,設定5個互斥訊號量。semaphore stcik 5 ...
哲學家進餐問題
一張圓桌上坐著5名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一碗公尺飯,如圖所示。哲學家們傾注畢生精力用於思考和進餐,哲學家在思考時,並不影響他人。只有當哲學家飢餓的時候,才試圖拿起左 右兩根筷子 一根一根地拿起 如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿到了兩根筷子才可以開...