【操作系统】哲学家就餐问题
生活随笔
收集整理的這篇文章主要介紹了
【操作系统】哲学家就餐问题
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
問題
有五個哲學家圍坐在一圓桌旁,桌中央有一盤通心粉,每人面前有一只空盤子,每兩人之間放一只筷子。每個哲學家的行為是思考,感到饑餓,然后吃通心粉。為了吃通心粉,每個哲學家必須拿到兩只筷子,并且每個人只能直接從自己的左邊或右邊去取筷子。
一個簡單的解法是,用一個信號量表示一支筷子,這五個信號量構成信號量數組,所有信號量初始值為1,第I個哲學家的活動課描述為:
若五位哲學家同時饑餓而各自拿起了左邊的筷子,這使五個信號量 chopstick 均為 0,當他們試圖去拿起右邊的筷子時,都將因無筷子而無限期地等待下去,即可能會引起死鎖。為防止死鎖發生,哲學家進餐問題的改進解法:
方法一:至多只允許四位哲學家同時去拿左筷子,最終能保證至少有一位哲學家能進餐,并在用完后釋放兩只筷子供他人使用。
方法二:僅當哲學家的左右手筷子都拿起時才允許進餐。
方法三:規定奇數號哲學家先拿左筷子再拿右筷子,而偶數號哲學家相反。
請用PV操作描述上述三種方法。
解決方法
方法一
至多只允許四位哲學家同時去拿左筷子,最終能保證至少有一位哲學家能進餐,并在用完后釋放兩只筷子供他人使用
int chopstick[5] = {1, 1, 1, 1, 1}; int man = 4; //最多4個人可以拿左筷子 Philosopher( int i ) { //第i個哲學家while( true ) {think();wait( man ); //拿左筷子的哲學家不超過4個wait( chopstick[i] );wait( chopstick[ (i+1)%5 ] );eat();signal( chopstick[i] );signal( chopstick[(i+1)%5] );signal( man );} }方法二
僅當哲學家的左右手筷子都拿起時才允許進餐,否則將拿起的筷子放下
(1)為便于理解(2),先使用AND型信號量int chopstick[5] = {1, 1, 1, 1, 1}; Philosopher( int i ) {while( true ) {think();Swait( chopstick[i], chopstick[(i+1)%5] );eat();Ssignal( chopstick[i], chopstick[(i+1)%5] );} }(2) 使用PV操作// 使用加鎖方式,將取左右筷子的過程綁定為原子操作 int chopstick[5] = {1, 1, 1, 1, 1}; int muitex = 1; Philosopher( int i ) {while( true ) {think();wait( mutex );wait( chopstick[i] );wait( chopstick[(i+1)%5] );signal( mutex );eat();signal( chopstick[i] );signal( chopstick[(i+1)%5] );} }方法三
規定奇數號的哲學家先拿起他左邊的筷子,然后再去拿他右邊的筷子;而偶數號的哲學家則相反
int chopstick[5] = {1, 1, 1, 1, 1}; Philosopher( int i ) {while( true ) {think();if( i % 2 ) { //奇數號哲學家wait( chopstick[i] );wait( chopstick[(i+1)%5] );} else { //偶數號哲學家wait( chopstick[(i+1)%5] );wait( chopstick[i] );}eat();signal( chopstick[i] );signal( chopstick[(i+1)%5] );} }總結
以上是生活随笔為你收集整理的【操作系统】哲学家就餐问题的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 【计算机网络】数据链路相关技术
- 下一篇: 胜女的代价2剧情介绍