1. 程式人生 > >作業系統——生產者-消費者問題

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

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

問題描述:一組生產者程序和一組消費者程序共享一個初始為空、大小為 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);
        吃蘋果;
    }
}