三、操作系统——生产者-消费者问题(两个同步一个互斥)
一、問題描述
信號量機制實現進程互斥的步驟:
信號量機制實現進程同步的步驟:
注意:
前操作指的就是需要先進行的操作,比如:當緩沖區已滿的時候,消費者先取走緩沖區的產品,生產者才能生產產品放入緩沖區。這里的“消費者先取走緩沖區的產品”就是前操作;而” 生產者生產產品放入緩沖區“就是后操作
注意:
生產者-消費者問題中共存在3個信號量:一個是空閑緩沖區對應的信號量,一個是產品對應的信號量,還有一個是用來實現互斥訪問臨界區的互斥信號量
生產者每次要消耗一個空閑緩沖區,而消耗一個資源(空閑緩沖區)也就是對這個資源的信號量執行P操作。
因為P操作會對這個資源的信號量的數值進行-1操作,如果該信號量-1后的數值 < 0,說明在沒有進行-1操作之前,信號量的數值 是<= 0的。也就是說,在沒有進行-1操作之前已經沒有資源(空閑緩沖區),資源(空閑緩沖區)的數量為0,所以會使用block原語使進程從運行態進入阻塞態,并把該進程掛到該信號量的等待隊列(即阻塞隊列)中。
直到消費者釋放一個空閑緩沖區,也就是對空閑緩沖區對應的信號量執行了V操作之后,也就是增加一個空閑緩沖區之后,生產者進程才能再次被喚醒。
生產者進程在確認了空閑緩沖區的數量是足夠的情況下,會生產一個產品(非空閑緩沖區),也就是對 產品所對應的信號量執行V操作。
因為V操作會對產品所對應的信號量的數值進行+1操作,相當于是往空閑緩沖區中放了一個產品,即非空閑緩沖區數量+1。如果進行+1操作之后,該信號量的數值<=0,說明在沒有進行+1操作之前,該信號量的數值是<= -1的,這里的-1取絕對值之后代表的就是空閑緩沖區的數量,也就是等待隊列中的進程數量為1。這時,會使用wakeup原語喚醒等待隊列中的進程,讓等待隊列中的進程由阻塞態變為就緒態。
而消費者在消耗一個產品之前,需要對這個產品所對應的信號量執行P操作,表示要消耗一個產品(即非空緩沖區)。
二、問題分析
三、如何實現?
第一步:
首先,明確生產者需要做2間事情:生產一個產品 和 把產品放入緩沖區
消費者也需要做2間事情:從緩沖區取出一個產品 和 使用一個產品
第二步:
生產者生產一個產品之后,相當于是消耗了一個空閑的緩沖區,而空閑緩沖區的數量是由empty來控制的,需要將empty的數量進行-1操作,所以要在生產者生產一個產品之后執行P(empty)操作,表示消耗了一個空閑緩沖區。
第三步:
生產者把產品放入緩沖區之后,相當于是增加了一個產品(非空閑緩沖區),而非空閑緩沖區的數量是由full來控制的,需要將full的數量進行+1操作,所以要在生產者把產品放入緩沖區之后執行V(full)操作,表示增加了一個產品(非空閑緩沖區)
第四步:
消費者從緩沖區取出一個產品之前,需要執行P(full)操作,表示要消耗一個產品(非空緩沖區)
第五步:
消費者在使用產品之前,需要執行V(empty)操作,表示要增加一個空閑緩沖區
第六步:
實現多個生產者對生產者把產品放入緩沖區這個臨界區的互斥訪問
實現多個消費者對消費者從緩沖區取出產品這個臨界區的互斥訪問
生產者把產品放入緩沖區的操作應該放在臨界區內,這樣才能避免存在多個生產者并發的執行 將產品放入緩沖區的代碼。所以要在進入臨界區之前執行P(mutex)操作,離開臨界區之后執行V(mutex)操作。
消費者同理,需要在進入臨界區之前執行P(mutex)操作,離開臨界區之后執行V(mutex)操作。
注意:
對“前V后P”的理解:
前操作之后執行V操作,后操作之前執行P操作
在緩沖區為空的情況下:生產者生產產品需要在消費者消費產品之前。因此,在生產者生產產品之后,需要執行V(full)操作;消費者消費產品之前,需要執行P(full)操作
總結
以上是生活随笔為你收集整理的三、操作系统——生产者-消费者问题(两个同步一个互斥)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 搞懂CRF
- 下一篇: deepin tim(wine)无法安装