操作系統——吸煙者問題


這次介紹的幾個IPC(Inter-process Communication)進程間的通訊問題,加上上篇博客介紹的生產者-消費者問題及其變形,都是非常經典的IPC問題,在王道老師講解的時候,彈幕一片“秒啊”、“666”,這幾個問題的解決方案也着實讓人着迷,當我帶着懷疑去驗證時候,又有一種豁然開朗的感覺,這些都是單一進程問題所不曾有過的。

一、問題描述

二、問題分析

 

 

該問題本質上是“可生產多種產品的單生產者—多消費者”問題。

 

三、如何實現

是否需要設置一個專門的互斥信號量呢?

並不需要,本題中的緩沖區大小為1,在任何時刻四個同步信號量中最多只有一個是1,在任何時刻只有一個進程的P操作不會被阻塞,並順利地進入臨界區!

semaphore offer1 = 0;
semaphore offer2 = 0;
semaphore offer3 = 0;
semaphore finish = 0;
int i = 0;
provider(){
    while(1){
        if(i == 0){
           將組合一放桌上
           V(offer1);
        }else if(i == 1)
        {
            將組合二放桌上
            V(offer2);
        }else id(i == 2)
        {
            將組合三放桌上
            V(offer3);
        }
        i = (i+1)%3;
        P(finish);
    }
}
smoker1 (){
    while(1){
        P(offer1)
        從桌上拿走組合一;
        卷煙;
        抽掉;
        V(finish);
    }
}

smoker2 (){
    while(1){
        P(offer2)
        從桌上拿走組合二;
        卷煙;
        抽掉;
        V(finish);
    }
}

smoker3 (){
    while(1){
        P(offer3)
        從桌上拿走組合三;
        卷煙;
        抽掉;
        V(finish);
    }
}

 

四、總結

吸煙者問題的精華是如何實現“輪流讓各個吸煙者吸煙”,這里我們的解決方案是使用一個整形變量i來實現這個“輪流”過程的。

 


免責聲明!

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



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