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)
產品送往buffer
V(m)//可繼續生產
V(n)//喚醒消費者
}
消費者
{
P(n)//保證有產品可消費,避免死鎖
P(m)//阻止生產者生產
從buffer取走產品
V(m)//喚醒生產者生產
消費產品
}
注意點:P操作像是一個標志,進入臨界區之前需要將互斥進程進行P操作,以免搶占資源
③一個生產者,一個消費者,n個環形緩沖區
與②類似,但②無限緩沖區即總有空閑區域可以生產,該情況需要檢查緩沖區是否有空閑區域供生產,m=1,n=0,count=SIZEOFBUF
生產者
{
生產產品
P(count)//保證有空閑區域供生產,否則阻塞
P(m)
放入buffer
V(m)
V(n)//喚醒消費者
}
消費者
{
P(n)
P(m)
從buffer取產品
V(m)//喚醒生產者
V(count)//多空閑一個區域供生產者生產
消費產品
}
④兩個生產者,兩個消費者,一個公共緩沖區
兩個生產者、兩個消費者四者之間互斥使用公共緩沖區。增加兩個互斥值,m=1.n=0
生產者
{
生產產品
P(m)//確定是生產者
放入buffer
V(n)//喚醒消費者
}
消費者
{
P(n)//保證有產品可消費
從buffer取產品
V(m)//喚醒生產者
}
⑤兩個生產者,兩個消費者,n環形緩沖區,count=SIZEOFBUF ,n=0,m =1,
生產者
{
生產產品
P(count)//保證有空閑區域供生產,否則阻塞
P(m)
放入buffer
V(m)
V(n)//喚醒消費者
}
消費者
{
P(n)
P(m)
從buffer取產品
V(m)//喚醒生產者
V(count)//多空閑一個區域供生產者生產
消費產品
}
