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操作簡單的可以了解為:我用了,給你用。當出現多個生産者,多個消費者的時候隻需要在臨界資源上互斥通路即可。