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