經典程序同步與互斥問題 生產者消費者問題

2021-08-18 05:56:04 字數 1198 閱讀 3066

問題描述:生產者——消費者問題是指有兩組程序共享乙個環形的緩衝池,一組稱為生產者,一組稱為消費者。緩衝池是由若干個大小相等的緩衝區組成,每個緩衝區可以容納乙個產品。生產者程序不斷的將產品放入緩衝池中,消費者不斷將產品從緩衝池中取出。

核心:生產者——消費者問題,既存在著程序同步問題,也存在著臨界區互斥問題。當緩衝區滿時,表示供大於求,生產者必須停止生產,進入等待狀態,同時喚醒消費者;當所有緩衝區都為空時,表示供不應求,消費者必須停止消費,喚醒生產者。這就是生產者程序和消費者程序的同步關係。對於緩衝池,生產者和消費者都要使用它,顯然他是乙個臨界資源,對於緩衝池的操作必須是互斥的。

這裡採用p、v操作解決生產者消費者問題的形式化描述

semaphore mutex=1;

semaohore empty=n;

semaphore full=0 //定義是3個訊號量

int i,j;

item buffer[n];

item data_p,data_c;

void producer()

}void consumer()

}

總結:

1.把共享緩衝池的n個緩衝區視為臨界資源,程序在使用時,首先要檢查是否有其他程序在臨界區,確認沒有時在進入。在程式中,p(mutex)和v(mutex)用於實現對臨界區的互斥,p(mutex)和v(mutex)必須成對出現。

2.訊號量full表示有資料的緩衝區的數目,初始值為0,empty表示空閒緩衝區的數目,初始值為n。他們表示的都是資源的數目,因此稱為資源訊號量。實際上,full和empty之間存在關係,full+empty=n。對資源訊號量的pv操作同樣需要成對出現,與互斥訊號量不同的是,p操作和v操作分別處於不同的程式中,例如p(empty)在生產者程序中,而v(empty)在消費者程序中。當生產者程序因執行p(empty)而阻塞時,由消費者程序的v(empty)將其喚醒;同理,當消費者程序因執行p(full)而阻塞時,生產者程序用v(full)將其喚醒。

思考:在生產者進行中的p(empty)和p(mutex)的位置能否互換?

顯然是不能的,如果交換後,就可能會發生死鎖。可以想象這種情況,生產者程序,執行p(mutex)進入臨界區,接下來執行p(empty),但現在empty為0,生產者被阻塞無法繼續生產,用時它又已經進入了臨界區,消費者進行由於無法進入臨界區,也被阻塞。這樣整個系統都被阻塞,發生死鎖現象。

經典程序同步與互斥問題

1.1 簡單的 生產者 消費者 問題 設程序a b是兩個相互合作的程序,它們共享乙個緩衝區,程序a向其中寫入資料,程序b從中讀出資料。producer 生產者程序,consumer 消費者程序。當緩衝區不空時,消費者便可以讀資料 當緩衝區為空時,生產者便可以寫資料。設定訊號量 full 表示有資料緩...

經典程序同步與互斥問題

二 讀者與寫者問題 三 哲學家進餐過程 設定3個訊號量 mutex 1,full 0,empty n 假設緩衝池大小為n p empty p mutex 寫入資料 v mutex v full p full p mutex 讀取資料 v mutex v empty 乙個資料物件 如檔案 記錄 可以被...

OS 程序同步 生產者消費者

注意 在每個程式中多個wait操作順序不可以顛倒。應先執行對資源訊號量的wait操作,然後再執行對互斥訊號量的wait操作,否則可能引起程序死鎖。概述 p操作 同步再前,互斥再後 記錄型訊號量 include using namespace std int in 0 佇列的隊首 int out 0 ...