PV操作典型 哲學家進餐問題

2021-10-06 13:28:23 字數 2122 閱讀 1790

哲學家進餐是作業系統課程的典型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名哲學家,每兩個哲學家之間的桌上擺一根筷子,桌子的中間是一碗公尺飯,如圖所示。哲學家們傾注畢生精力用於思考和進餐,哲學家在思考時,並不影響他人。只有當哲學家飢餓的時候,才試圖拿起左 右兩根筷子 一根一根地拿起 如果筷子已在他人手上,則需等待。飢餓的哲學家只有同時拿到了兩根筷子才可以開...