作業系統——生產者-消費者問題
阿新 • • 發佈:2018-12-07
一、簡單生產者-消費者問題
問題描述:一組生產者程序和一組消費者程序共享一個初始為空、大小為 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); 吃蘋果; } }