一、問題描述
二、問題分析
該問題中出現的主要的兩種關系:
①生產者—消費者之間的同步關系表現為:一旦緩沖池中所有緩沖區均裝滿產品時,生產者必須等待消費者提供空緩沖區;一旦緩沖池中所有緩沖區全為空時,消費者必須等待生產者提供滿緩沖區。
②生產者—消費者之間還有互斥關系:由於緩沖池是臨界資源,所以任何進程在對緩沖區進行存取操作時都必須和其他進程互斥進行。
PV操作題目分析的步驟:
1.關系分析。找出題目中描述的各個進程,分析它們之間的同步、互斥關系。
2.整理思路。根據各進程的操作流程確定PV操作的大致順序。
3.設置信號量。設置需要的信號量,並根據題目條件確定信號量的初值。(互斥信號量初值一般為1,同步信號量的初值需要看對應資源的初始值是多少)
在這里:
互斥的實現是在同一個進程中進行的一對PV操作。
同步的實現是在兩個進程中進行的,在一個進程中執行P操作,在另一個進程中執行V操作。
semaphore mutex = 1; //互斥信號量 semaphore empty = n; //同步信號量。空閑緩沖區的數量 semaphore full = 0; //同步信號量。產品的數量,非空緩沖區的數量 producer(){ while(1){ 生成一個產品; P(empty); //消耗一個空閑緩沖區 P(mutex); 把產品放入緩沖區; V(mutex); V(full) //增加一個產品 } } consumer(){ while(1){ P(full); //消耗一個產品 P(mutex); 從緩沖區取出一個產品; V(mutex); V(empty); //增加一個空閑緩沖區 使用產品; } }
實現互斥的P操作一定要放在實現同步的P操作之后!
我們觀察上面的代碼,生產者生產產品和消費者使用產品這兩個操作都是放在各自進程的PV操作之外的,那么能不能放在各自的PV操作之內呢?其實從邏輯上來說是可以的,比如從緩沖區取出一個產品之后立即使用這個產品,但是這樣就會造成臨界區的代碼量變大,消費者進程訪問臨界區將會耗費更多的時間,若此時有別的進程想要訪問臨界區是會被阻塞的,若將這些不是很非代碼也放入臨界區,會造成進程的並發度降低。
三、重要考點