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