生产者消费者问题
文章目錄
- 1.生產(chǎn)者消費(fèi)者問題
- 1.1 問題描述
- 1.2 問題分析
- 1.3 如何實(shí)現(xiàn)
- 1.4 思考
- ① -> ② -> ③
- ③ -> ④ -> ①
- 1.5 小結(jié)
- 2.多生產(chǎn)者 - 多消費(fèi)者
- 2.1 問題描述
- 2.2 問題分析
- 2.3 如何實(shí)現(xiàn)
- 2.4 小結(jié)
1.生產(chǎn)者消費(fèi)者問題
1.1 問題描述
系統(tǒng)中有一組生產(chǎn)者進(jìn)程和一組消費(fèi)者進(jìn)程,生產(chǎn)者進(jìn)程每次生產(chǎn)一個(gè)產(chǎn)品放入緩沖區(qū),消費(fèi)者進(jìn)程每次從緩沖區(qū)中取出一個(gè)產(chǎn)品并使用。(注:這里的“產(chǎn)品”理解為某種數(shù)據(jù))
生產(chǎn)者、消費(fèi)者共享一個(gè)初始為空、大小為n的緩沖區(qū)。
只有緩沖區(qū)沒滿時(shí),生產(chǎn)者才能把產(chǎn)品放入緩沖區(qū),否則必須等待。(緩沖區(qū)沒滿 ——>生產(chǎn)者生產(chǎn))
只有緩沖區(qū)不空時(shí),消費(fèi)者才能從中取出產(chǎn)品,否則必須等待。(緩沖區(qū)沒空——>消費(fèi)者消費(fèi))
緩沖區(qū)是臨界資源,各進(jìn)程必須互斥地訪問。(互斥關(guān)系)
1.2 問題分析
PV操作題目分析步驟:
1.3 如何實(shí)現(xiàn)
1.4 思考
思考:能否改變相鄰P、V操作的順序?
① -> ② -> ③
若此時(shí)緩沖區(qū)內(nèi)已經(jīng)放滿產(chǎn)品,則empty=0,full=n。
則生產(chǎn)者進(jìn)程執(zhí)行①使mutex變?yōu)?,再執(zhí)行②,由于已沒有空閑緩沖區(qū),因此生產(chǎn)者被阻塞。由于生產(chǎn)者阻塞,因此切換回消費(fèi)者進(jìn)程。消費(fèi)者進(jìn)程執(zhí)行③,由于mutex為0,即生產(chǎn)者還沒釋放對(duì)臨界資源的“鎖”,因此消費(fèi)者也被阻塞。這就造成了生產(chǎn)者等待消費(fèi)者釋放空閑緩沖區(qū),而消費(fèi)者又等待生產(chǎn)者釋放臨界區(qū)的情況,生產(chǎn)者和消費(fèi)者循環(huán)等待被對(duì)方喚醒,出現(xiàn)“死鎖”。
③ -> ④ -> ①
同樣的,若緩沖區(qū)中沒有產(chǎn)品,即full=0,empty=n。按③④① 的順序執(zhí)行就會(huì)發(fā)生死鎖。
因此,實(shí)現(xiàn)互斥的P操作一定要在實(shí)現(xiàn)同步的P操作之后。
V操作不會(huì)導(dǎo)致進(jìn)程阻塞,因此兩個(gè)V操作順序可以交換。
1.5 小結(jié)
易錯(cuò)點(diǎn):實(shí)現(xiàn)互斥和實(shí)需要“前V后P”現(xiàn)同步的兩個(gè)P操作的先后順序(死鎖問題)
2.多生產(chǎn)者 - 多消費(fèi)者
2.1 問題描述
桌子上有一只盤子,每次只能向其中放入一個(gè)水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,兒子專等著吃盤子中的橘子,女兒專等著吃盤子中的蘋果。只有盤子空時(shí),爸爸或媽媽才可向盤子中放一個(gè)水果。僅當(dāng)盤子中有自己需要的水果時(shí),兒子或女兒可以從盤子中取出水果。
用PV操作實(shí)現(xiàn)上述過程。
2.2 問題分析
-
互斥關(guān)系:(mutex = 1)
對(duì)緩沖區(qū)(盤子)的訪問要互斥地進(jìn)行 -
同步關(guān)系(一前一后):
父親將蘋果放入盤子后,女兒才能取蘋果
母親將橘子放入盤子后,兒子才能取橘子
只有盤子為空時(shí),父親或母親才能放入水果
2.3 如何實(shí)現(xiàn)
semaphore mutex = 1; // 實(shí)現(xiàn)互斥訪問盤子(緩沖區(qū)) semaphore apple = 0; // 盤子中有幾個(gè)蘋果 semaphore orange = 0; // 盤子中有幾個(gè)橘子 semaphore plate = 1; // 盤子中還可以放多少個(gè)水果問題:可不可以不用互斥信號(hào)量?
結(jié)論:即使不設(shè)置專門的互斥變量mutex,也不會(huì)出現(xiàn)多個(gè)進(jìn)程同時(shí)訪問盤子的現(xiàn)象
原因在于:本題中的緩沖區(qū)大小為1,在任何時(shí)刻,apple、 orange、 plate 三個(gè)同步信號(hào)量中最多只有一個(gè)是1。因此在任何時(shí)刻,最多只有一個(gè)進(jìn)程的P操作不會(huì)被阻塞,并順利地進(jìn)入臨界區(qū)…
semaphore apple = 0; // 盤子中有幾個(gè)蘋果 semaphore orange = 0; // 盤子中有幾個(gè)橘子 semaphore plate = 2; // 盤子中還可以放多少個(gè)水果父親P(plate) ,可以訪問盤子 -----> 母親P(plate) ,可以訪問盤子 ----->父親在往盤子里放蘋果,同時(shí)母親也可以往盤子里放橘子。于是就出現(xiàn)了兩個(gè)進(jìn)程同時(shí)訪問緩沖區(qū)的情況,有可能導(dǎo)致兩個(gè)進(jìn)程寫入緩沖區(qū)的數(shù)據(jù)相互覆蓋的情況。
因此,如果緩沖區(qū)大小大于1,就必須專門設(shè)置一個(gè)互斥信號(hào)量 mutex 來保證互斥訪問緩沖區(qū)。
2.4 小結(jié)
總結(jié):在生產(chǎn)者 - 消費(fèi)者問題中,如果緩沖區(qū)大小為1,那么有可能不需要設(shè)置互斥信號(hào)量就可以實(shí)現(xiàn)互斥訪問緩沖區(qū)的功能。當(dāng)然,這不是絕對(duì)的,要具體問題具體分析。
建議:在考試中如果來不及仔細(xì)分析,可以加上互斥信號(hào)量,保證各進(jìn)程一定會(huì)互斥地訪問緩沖區(qū)。但需要注意的是,實(shí)現(xiàn)互斥的P操作一定要在實(shí)現(xiàn)同步的P操作之后,否則可能引起“死鎖”。
PV 操作題目的解題思路:
要在實(shí)現(xiàn)同步的P操作之后,否則可能引起“死鎖”。
PV 操作題目的解題思路:
總結(jié)
- 上一篇: linux xilinx,Xilinx-
- 下一篇: OpenMP - 维基百科,自由的百科全