生產者-消費者問題
分析問題,確定臨界區
設定互斥訊號量,初值為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 ...