作業系統 訊號量(生產者消費者問題)

2021-08-21 07:05:39 字數 964 閱讀 1041

1、問題描述:一組生產者程序和一組消費者程序共享乙個初始為空大小為n的緩衝區,只有緩衝區沒滿時,生產者才能給緩衝區投放資訊,否則必須等待;只有緩衝區不空時,消費者才能繼續取出訊息,否則也必須等待。由於緩衝區是臨界資源,他只允許乙個程序投放資源或者乙個程序取出資源。

2、分析:

首先,緩衝區是臨界資源,那麼不論是生產者還是消費者訪問臨界資源的時候都必須是互斥的訪問。所以,對於訪問臨界資源必須有個互斥訊號量———mutex,其初始值為1,表示可以訪問。對於臨界資源的訪問不分這個生產者還是消費者,誰訪問都一樣,都是乙個程序訪問臨界資源的時候其他程序得等待。

其次,生產者與消費者是互相合作的關係,我們說,為完成某種任務而建立的多個程序,這些程序因為要在某些位置上協調他們的工作次序而等待,比如說a程序要工作必須等待b程序的乙個結果,如果僅僅是a程序單方面的需要b程序的乙個結果,那這張制約關係就是單方向的(此處的單方向和下面雙方向是我個人的理解而用的詞彙),如果同時b程序的工作也需要a程序工作的結果,那麼這就是雙方向的互相制約了。

而生產者-消費者問題裡的同步關係我認為是雙方向的,原因如下:生產者要生產的前提是緩衝區沒滿,而緩衝區沒滿是消費者執行後的結果,同樣消費者要執行的前提是緩衝區不空,而緩衝區不空是生產者不斷生成的結果。所以,按本人的理解就是雙方向制約的關係。也許有人好奇為什麼要搞這麼細,原因很簡答,在指定同步關係的訊號量的時候乙個制約就是乙個訊號量,本題的同步關係需要兩個訊號量。乙個是消費者通知生產者是否可以生產的「有空位」訊號量——empty,乙個是生產者通知消費者要消費的「有資訊」訊號量——full。

3,具體描述

semaphore mutex=1;//互斥訊號量

semaphore empty=n;//代表的是臨界區的空位

semaphore full=0;//代表的是臨界區的資料。空位+資料=n

producer()

}consumer()

}

Linux系統訊號量實現生產者 消費者問題

include include include include using namespace std const int buffer size 1024 const int wait time 10 sem t empty sem t full pthread mutex t mtx pthre...

使用訊號量實現生產者 消費者問題

問題描述 使用乙個緩衝區來儲存物品,只有緩衝區沒有滿,生產者才可以放入物品 只有緩衝區不為空,消費者才可以拿走物品。因為緩衝區屬於臨界資源,因此需要使用乙個互斥量 mutex 來控制對緩衝區的互斥訪問。為了同步生產者和消費者的行為,需要記錄緩衝區中物品的數量。數量可以使用訊號量來進行統計,這裡需要使...

Linux訊號量機制(生產者消費者)

該程式為linux訊號量機制實現程式,主要模擬了一般的生產者 消費者問題。生產者 消費者問題是乙個經典的程序同步問題,該問題最早由dijkstra提出,用以演示他提出的訊號量機制。在同乙個程序位址空間內執行的兩個執行緒。生產者執行緒生產物品,然後將物品放置在乙個空緩衝區中供消費者執行緒消費。消費者執...