操作系統(哲學家進餐問題)


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

問題分析:

筷子是臨界資源,一次只能被一個哲學家使用。因此,五個人不能同時拿起左邊的筷子(或右邊)否則或引起死鎖。

解決方案:

(1)至多只允許四位哲學家同時拿左邊的筷子,最終保證有一位哲學家能夠進餐,並且用完能夠釋放筷子,讓更多的哲學家進餐。

(2)僅當哲學家左右兩只筷子都可以用的時候,才允許拿筷子進餐。

semaphore chopstick[5]={1,1,1,1,1};//五個信號量,一個信號量代表一只筷子 
semaphore mutex=1;
Pi(){
    while(1){
        wait(mutex);//設置信號量,防止其它人爭奪資源 
        wait(chopstick[i]);
        wait(chopstick[(i+1)%5]);
        signal(mutex);//拿到兩只筷子后釋放信號量 
        吃飯;
        signal(chopstick[i]);//吃過飯后,釋放筷子資源 
        signal(chopstick[(i+1)%5]);
    }
}

(3)奇數號哲學家先拿左邊的,再拿右邊的;偶數則相反。即五位哲學家都先競爭奇數號筷子,獲得后再去競爭偶數號筷子,最終總會有一位哲學家有兩只筷子。

semaphore chopstick[5]={1,1,1,1,1};
Pi(){
    while(1){
        if(i%2!=0){//奇數號哲學家 
            wait(chopstick[i]);//拿左邊的 
            wait(chopstick[(i+1)%5]);//右邊的 
        }else{//偶數號哲學家 
            wait(chopstick[(i+1)%5]);//右邊的 
            wait(chopstick[i]);//左邊的 
        }
        進餐; 
        signal(chopstick[i]);//釋放筷子資源 
        signal(chopstick[(i+1)%5]);
    }
}

 

                                                                                                                                                                                             


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM