1 問題描述
系統中有一組生產者程序和一組消費者程序,生產者程序每次生產乙個產品放入緩衝區,消費者程序每次從緩衝區中取出乙個產品並使用。(注:這裡的「產品」理解為某種資料)2 問題分析
生產者、消費者共享乙個初始為空、大小為n的緩衝區。
只有緩衝區沒滿時,生產者才能把產品放入緩衝區,否則必須等待。
緩衝區沒滿→生產者生產 ---------同步關係只有緩衝區不空時,消費者才能從中取出產品,否則必須等待。
緩衝區沒空→消費者消費 ---------同步關係緩衝區是臨界資源,各程序必須互斥地訪問。--------- 互斥關係
同步關係分析:前v後p
pv
操作分析步驟:關係分析。找出題目中描述的各個程序,分析它們之間的同步、互斥關係。
整理思路。根據各程序的操作流程確定p、v操作的大致順序。
設定訊號量。並根據題目條件確定訊號量初值。(互斥訊號量初值一般為1,同步訊號量的初始值要看對應資源的初始值是多少)
2 問題描述
由以上分析,可知生產者-消費者問題中訊號量設定:
semaphore mutex =1;
//互斥訊號量,實現對緩衝區的互斥訪問
semaphore empty = n;
//同步訊號量,表示空閒緩衝區的數量
semaphore full =0;
//同步訊號量,表示產品的數量,也即非空緩衝區的數量
同步模型:
問題模型:3 **實現生產者生產商品,然後判斷緩衝區是否為空(p一下空閒緩衝區),把產品放入後(v一下產品數量。通知消費者程序)
消費者首先判斷有沒有商品(p一下商品數量),從緩衝區中取出產品後(v一下空閒緩衝區。通知生產者程序),進而消耗商品
還需要實現各個程序對緩衝區的互斥訪問
生產者程序每次要消耗(p)乙個空閒緩衝區,並生產(v)乙個產品
消費者程序每次消耗(p)乙個產品,並釋放乙個空閒緩衝區(v)
pv一對
pv一對
semaphore mutex =1;
//互斥訊號量,實現對緩衝區的互斥訪問
semaphore empty = n;
//同步訊號量,表示空閒緩衝區的數量
semaphore full =0;
//同步訊號量,表示產品的數量,也即非空緩衝區的數量
producer()
}consumer()
}
4 分析總結能否改變相鄰p、v操作的順序?因此,實現互斥的p操作一定要在實現同步的p操作之後,如果交換會產生死鎖現象。分析: 若此時緩衝區內已經放滿產品,則
empty=0,full=n
。 則生產者程序執行① 使mutex
變為0,再執行②,由於已沒有空閒緩衝區,因此生產者被阻塞。由於生產者阻塞,因此切換回消費者程序。消費者程序執行③,由於
mutex
為0,即生產者還沒釋放對臨界資源的「鎖」,因此消費者也被阻塞。這就造成了生產者等待消費者釋放空閒緩衝區,而消費者又等待生產者釋放臨界區的情況,生產者和消費者迴圈等待被對方喚醒,出現「死鎖」。
同樣的,若緩衝區中沒有產品,即
full=0,empty=n
。按③④① 的順序執行就會發生死鎖。
v操作不會導致程序阻塞,因此兩個v操作順序可以交換。
生產者消費者問題是乙個互斥、同步的綜合問題。包含了一對互斥,兩對同步
緩衝區為空,生產者生產需要在消費者消費之前,因此在生產者生產之後執行v操作(前v,即前面操作之後執行v操作),在消費者消費之前,執行p操作(後p,即後面操作之前執行p操作)
生產者消費者問題
public class producer consumer class godown public godown int num public synchronized void produce int n catch interruptedexception e curr num n syste...
生產者 消費者問題
在學習程序互斥中,有個著名的問題 生產者 消費者問題。這個問題是乙個標準的 著名的同時性程式設計問題的集合 乙個有限緩衝區和兩類執行緒,它們是生產者和消費者,生產者把產品放入緩衝區,相反消費者便是從緩衝區中拿走產品。生產者在緩衝區滿時必須等待,直到緩衝區有空間才繼續生產。消費者在緩衝區空時必 須等待...
生產者 消費者問題
1 程序互斥問題 緩衝區b是臨界資源,程序p和c不能同時對b進行操作,即只能互斥的操作 2 程序同步問題 p不能往 滿 的的緩衝區b放產品,c不能從空的緩衝區獲得產品。當緩衝區滿時,c必須先於p執行,當緩衝區空時,p必須先於c執行 我們給出如下基於記錄型 二元 訊號量機制的解法 10 9 2013 ...