PV操作經典例題 哲學家進餐問題

2021-09-17 20:03:46 字數 1522 閱讀 3673

哲學家進餐問題:

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

分析:放在桌子上的筷子是臨界資源,在一段時間內只允許一位哲學家使用,為了實現對筷子的互斥訪問,可以用乙個訊號量表示筷子,由這五個訊號量構成訊號量陣列。

semaphore chopstick[5]

=;while

(true)

為避免死鎖,可以使用以下三種策略

策略一:至多只允許四個哲學家同時進餐,以保證至少有乙個哲學家能夠進餐,最終總會釋放出他所使用過的兩支筷子,從而可使更多的哲學家進餐。定義訊號量count,只允許4個哲學家同時進餐,這樣就能保證至少有乙個哲學家可以就餐。

semaphore chopstick[5]

=;semaphore count=4;

// 設定乙個count,最多有四個哲學家可以進來

void

philosopher

(int i)

}

策略二:僅當哲學家的左右兩支筷子都可用時,才允許他拿起筷子進餐。可以利用and 型訊號量機制實現,也可以利用訊號量的保護機制實現。利用訊號量的保護機制實現的思想是通過記錄型訊號量mutex對取左側和右側筷子的操作進行保護,使之成為乙個原子操作,這樣可以防止死鎖的出現。描述如下:

用記錄型訊號量實現:

semaphore mutex =1;

// 這個過程需要判斷兩根筷子是否可用,並保護起來

semaphore chopstick[5]

=;void

philosopher

(int i)

}

用and型訊號量實現:

semaphore chopstick[5]

=;dowhile

(true)

策略三:規定奇數號的哲學家先拿起他左邊的筷子,然後再去拿他右邊的筷子;而偶數號的哲學家則先拿起他右邊的筷子,然後再去拿他左邊的筷子。按此規定,將是1、2號哲學家競爭1號筷子,3、4號哲學家競爭3號筷子。即五個哲學家都競爭奇數號筷子,獲得後,再去競爭偶數號筷子,最後總會有乙個哲學家能獲得兩支筷子而進餐。

semaphore chopstick[5]

=;void

philosopher

(int i)

else

//奇數哲學家,先左後右。

}}

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

哲學家進餐是作業系統課程的典型pv操作問題。通過此問題學習 1.熟悉linux平台的基本程式設計 2.在linux平台上通過系統呼叫使用執行緒 互斥量機制以及訊號量機制等進行程式設計 內容 在unix系統下實現哲學家就餐問題 要求顯示出每個哲學家的工作狀態,如吃飯,思考 連續執行30次以上都未出現死...

哲學家進餐問題

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

哲學家進餐問題

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