操作系統——生產者-消費者問題


一、簡單生產者-消費者問題

問題描述:一組生產者進程和一組消費者進程共享一個初始為空、大小為 n 的緩沖區,只有緩沖區沒滿時,生產者才能把消息放入到緩沖區,否則必須等待;只有緩沖區不為空時,消費者才能從中取出消息,否則必須等待。由於緩沖區是臨界資源,它只允許一個生產者放入消息,或者一個消費者從中取出消息。

問題分析:

  (1)關系分析。生產者和消費者對緩沖區互斥訪問是互斥關系,同時生產者和消費者又是一個相互協作的關系,只有生產者生產后消費者才能消費,也是同步關系

  (2)整理思路。只有生產者、消費者兩個進程,且存在互斥和同步關系。所以需要解決的是互斥和同步 P V 操作的位置

  (3)信號量設置。信號量 mutex 作為互斥信號量,用於控制互斥訪問緩沖池,初值為 1 ;信號量 full 用於記錄緩沖池中滿緩沖區數,初值為 0 ;信號量 empty 用於記錄緩沖池中空緩沖區數,初值為 n。

進程偽代碼描述:

 1 semaphore mutex = 1;           // 臨界區互斥信號量
 2 semaphore empty = n;           // 空閑緩沖區
 3 semaphore full = 0;            // 滿緩沖區
 4 
 5 producer() {
 6     while(1){
 7         生產數據;
 8         P(empty);
 9         P(mutex);
10         將數據放入緩沖區;
11         V(mutex);
12         V(full);
13     }
14 }
15 
16 Customer() {
17     while(1){
18         P(full);
19         P(mutex);
20         將數據沖緩沖區取出;
21         V(mutex);
22         V(empty);
23         使用數據;
24     }
25 }

 

二、橘子-蘋果問題

問題描述:桌子上有一只盤子,每次只能向其中放入一個水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,兒子專吃橘子,女兒專吃蘋果。只要盤子為空,爸爸媽媽就可以向盤子中放一個水果;只有盤子中有想吃的水果時,兒子女兒才能取出一個水果吃

問題分析:

  (1)關系分析:爸爸媽媽是互斥關系,臨界資源為盤子;爸爸和女兒、媽媽和兒子是同步關系,且這兩對進程必須連起來;兒子和女兒之間沒有互斥同步關系。

  (2)整理思路:可以抽象為兩個生產者和兩個消費者被連接到大小為 1 的緩沖區上。

  (3)信號量設置:首先設置信號量 plate 為互斥信號量,初值為 1;信號 apple 為同步信號量,初值為 0;信號 orange 為同步信號量,初值為 0。

進程偽代碼描述:

semaphore plate = 1;      // 盤子
semaphore apple = 0;     // 蘋果
semaphore orange = 0;   // 橘子

Father() {
    while(1){
        准備一個蘋果;
        P(plate);
        將蘋果放入盤子中;
        V(apple);
    }
}

Mother() {
    while(1){
        准備一個橘子;
        P(plate);
        將橘子放入盤子中;
        V(orange);
    }
}

Son() {
    while(1){
        P(orange);
        將橘子取出;
        V(plate);
        吃橘子;
    }
}

Daughter() {
    while(1){
        P(apple);
        將蘋果取出;
        V(plate);
        吃蘋果;
    }
}

 


免責聲明!

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



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