生產者、消費者問題初理解


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)//多空閑一個區域供生產者生產

消費產品

}


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM