天天看點

生産者消費者模式(轉)

1.PV操作

PV操作是由P操作原語和V操作原語組成,對信号量進行操作。

P(S):意為占用,将信号量的值減1,S=S-1,如果S>=0,則該程序繼續執行,否則進入等待隊列;

V(S):意為釋放,将信号量的值加1,S=S+1,如果S>0,則該程序繼續執行,否則釋放隊列中第一個等待信号量的程序。

為了更形象的了解PV操作,可以聯想一下電話亭場景:

P:第一個人占用電話亭打電話,可用電話亭數-1,S=S-1,接下來的人先檢測S-1,如果S>=0,說明目前使用者有電話亭可用,如果S<0,說明無電話亭可用,S=-i說明自己剛好是第i個排隊的人。

V:使用完電話亭就推門走開,将S加1,如果S>=2,說明這個人剛剛打電話時電話亭空閑一個;如果S=1,說明這個人剛好騰出一個空;如果S<=0說明有人排隊,按照排隊次序依次填補打電話。

2.同步和互斥

同步是程序之間直接的制約關系,展現工作次序,這種制約源于程序之間的合作,生産者和消費者關系就是同步關系。

互斥是程序之間間接的制約關系,這種制約源于對臨界資源的通路,線程之間共享記憶體需要用到互斥關系。

生産者和消費者問題既是同步也是互斥的關系,一方面,作為平等程序,對緩沖區的通路時競争關系,即互斥;另一方面,作為生産者和消費者兩個程序有先後次序,存在合作關系是以是同步的。

3.生産者、消費者、緩沖區問題

①一個生産者,一個消費者,一個公共緩沖區: 隻需保證,生産者先生産,消費者後消費,兩者互斥使用緩沖區即可。m=1,n=0

生産者

{

生産産品

P(m)//保證生産者無法再生産

産品送往buffer

V(n)//喚醒消費者

}

消費者

P(n)//保證消費者不能先于生産者

從buffer取走産品

V(m)//喚醒生産者繼續生産

消費産品

②一個生産者,一個消費者,無數個公共緩沖區:

與①不同在于,生産者可以不斷生産,消費者可以不斷消費,隻需保證消費者有産品可消費。m=1,n=0

P(m)

V(m)//可繼續生産

P(n)//保證有産品可消費,避免死鎖

P(m)//阻止生産者生産

V(m)//喚醒生産者生産

注意點:P操作像是一個标志,進入臨界區之前需要将互斥程序進行P操作,以免搶占資源

③一個生産者,一個消費者,n個環形緩沖區

與②類似,但②無限緩沖區即總有空閑區域可以生産,該情況需要檢查緩沖區是否有空閑區域供生産,m=1,n=0,count=SIZEOFBUF

P(count)//保證有空閑區域供生産,否則阻塞

放入buffer

V(m)

P(n)

從buffer取産品

V(m)//喚醒生産者

V(count)//多空閑一個區域供生産者生産

④兩個生産者,兩個消費者,一個公共緩沖區

兩個生産者、兩個消費者四者之間互斥使用公共緩沖區。增加兩個互斥值,m=1.n=0

P(m)//确定是生産者

P(n)//保證有産品可消費

⑤兩個生産者,兩個消費者,n環形緩沖區,count=SIZEOFBUF ,n=0,m =1,

自己的一點了解:其實P,V操作簡單的可以了解為:我用了,給你用。當出現多個生産者,多個消費者的時候隻需要在臨界資源上互斥通路即可。