作業系統,生產者 消費者問題詳解

2021-10-05 01:51:50 字數 1687 閱讀 5207

生產者-消費者問題

分析問題,確定臨界區

設定互斥訊號量,初值為1

臨界區之前對訊號量執行p操作臨界區之後對訊號量執行v操作分析問題,找出**需要實現「一前一後」的同步關係

設定同步訊號量,初始值為0

在「前操作」之後執行v操作在「後操作」之前執行p操作分析問題,畫出前驅圖,把每一對前驅關係都看成乙個同步問題

為每一對前驅關係設定同步訊號量,初值為0

在每個「前操作」之後執行v操作在每個「後操作」之前執行p操作

注:

申請資源時進行p操作

釋放資源時程序v操作

系統中有一組生產者程序和一組消費者程序,生產者程序每次生產乙個產品放入緩衝區,消費者

程序每次從緩衝區中取出乙個產品並使用。(注:這裡的「產品」理解為某種資料)

生產者、消費者共享乙個初始為空、大小為n的緩衝區。

只有緩衝區沒滿時,生產者才能把產品放入緩衝區,否則必須等待。

分析:

同步關係,緩衝區滿時,生產者要等待消費者取走產品

只有緩衝區不空時,消費者才能從中取出產品,否則必須等待。

分析:

同步關係,緩衝區空時(即沒有產品時),消費者要等待生產者放入產品

緩衝區是臨界資源,各程序必須互斥地訪問。

分析:

互斥

生產者每次要消耗(p)乙個空閒緩衝區,並生產(v)乙個產品。

消費者每次要消耗(p)乙個產品,並釋放乙個空閒緩衝區(v),

往緩衝區放入/取走產品需要互斥。

semaphore mutex = 1; 	//互斥訊號量,實現對緩衝區的互斥訪問

semaphore empty = n; //同步訊號量,表示空閒緩衝區的數量

semaphore full = 0; //同步訊號量,表示產品的數量,也即非空緩衝區的數量

生產者

producer ()

}

消費者

consumer ()

}

若此時緩衝區內已經放滿產品,則 empty=0,full=n。

則生產者程序執行① 使mutex變為0,再執行②,由於已沒有空閒緩衝區,因此生產者被阻塞。

由於生產者阻塞,因此切換回消費者程序。消費者程序執行③,由於mutex為0,即生產者還沒

釋放對臨界資源的「鎖」,因此消費者也被阻塞。

這就造成了生產者等待消費者釋放空閒緩衝區,而消費者又等待生產者釋放臨界區的情況,生

產者和消費者迴圈等待被對方喚醒,出現「死鎖」。

同樣的,若緩衝區中沒有產品,即full=0,empty=n。按③④① 的順序執行就會發生死鎖。

因此,實現互斥的p操作一定要在實現同步的p操作之後。

v操作不會導致程序阻塞,因此兩個v操作順序可以交換。

生產者消費者問題是乙個互斥、同步的綜合問題。

對於初學者來說最難的是發現題目中隱含的兩對同步關係。

有時候是消費者需要等待生產者生產,有時候是生產者要等待消費者消費,這是兩個不同的「一

前一後問題」,因此也需要設定兩個同步訊號量。

作業系統裡的生產者 消費者問題

前段時間網上有乙個人讓我幫他改個程式,作業系統裡面生產者與消費者的那個程式,寫的一片混亂,改了好長時間。很弱智。include include include include include using namespace std define buffer num 6 int product bu...

作業系統中關於生產者消費者問題

m個消費者,r個消費者和n個緩衝器 分析 現在是m個生產者在生產了產品向緩衝器存放時,由於只有乙個指示位置的共享變數k,所以那些所有的生產者需要互斥訪問共享變數k,即同一時刻只能有乙個訪問,同理消費者共享了指示位置的t,所有消費者也要互斥訪問共享變數t,顯然生產者需要乙個乙個的去緩衝器中存放物品,而...

生產者和消費者問題c 作業系統)

生產者和消費者 include include include includeusing namespace std const unsigned short size of buffer 10 緩衝區長度 unsigned short productid 0 產品號 unsigned short ...