哲學家就餐問題 (DPP)


哲學家就餐問題描述了五個哲學家圍坐在圓桌旁,他們交替進行思考和進餐。每個哲學家面前有一碗米飯和五根筷子。一個哲學家需要同時擁有左右兩根筷子才能進餐。只有當左右兩根筷子都可用時,飢餓的哲學家才能開始進餐。否則,哲學家放下筷子,繼續思考。

哲學家就餐問題是一個經典的同步問題,它展示了一大類併發控制問題。

哲學家就餐問題的解決方法

解決哲學家就餐問題的一種方法是使用訊號量來表示筷子。可以透過對訊號量執行等待操作來拿起筷子,並透過執行訊號操作來放下筷子。

筷子的結構如下所示:

semaphore chopstick [5];

最初,筷子的元素被初始化為1,因為筷子放在桌子上,沒有被任何哲學家拿起。

隨機哲學家i的結構如下所示:

do {
   wait( chopstick[i] );
   wait( chopstick[ (i+1) % 5] );
   . .
   . EATING THE RICE
   .
   signal( chopstick[i] );
   signal( chopstick[ (i+1) % 5] );
   .
   . THINKING
   .
} while(1);

在上述結構中,首先對chopstick[i]和chopstick[(i+1)%5]執行等待操作。這意味著哲學家i已經拿起了他兩側的筷子。然後執行進餐函式。

之後,對chopstick[i]和chopstick[(i+1)%5]執行訊號操作。這意味著哲學家i已經吃完並放下了他兩側的筷子。然後哲學家回到思考狀態。

解決方案的難點

上述解決方案確保了沒有兩個相鄰的哲學家能夠同時進餐。但是,此解決方案可能導致死鎖。如果所有哲學家同時拿起他們左邊的筷子,則可能發生這種情況。那麼他們沒有人能夠進餐,從而發生死鎖。

一些避免死鎖的方法如下:

  • 桌子上最多隻能有四個哲學家。
  • 偶數編號的哲學家應該先拿起右邊的筷子,然後再拿起左邊的筷子,而奇數編號的哲學家應該先拿起左邊的筷子,然後再拿起右邊的筷子。
  • 只有當兩根筷子都可用時,哲學家才允許拿起筷子。

更新於:2020年6月24日

39K+ 次瀏覽

開啟你的職業生涯

透過完成課程獲得認證

開始學習
廣告
© . All rights reserved.