生产者消费问题以及多生产者—消费者问题实现思想
生活随笔
收集整理的這篇文章主要介紹了
生产者消费问题以及多生产者—消费者问题实现思想
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
一、生產者消費問題
- 系統中有一組生產者進程和一組消費者進程,生產者進程每次生產一個產品放入緩沖區,消費者
- 進程每次從緩沖區中取出一個產品并使用。(注:這里的“產品”理解為某種數據)
- 生產者、消費者共享一個初始為空、大小為n的緩沖區。
- 只有 緩沖區沒滿 時,生產者才能把產品放入緩沖區,否則必須等待。 【緩沖區沒滿→生產者生產】
- 只有 緩沖區不空 時,消費者才能從中取出產品,否則必須等待。 【緩沖區沒空→消費者消費】
- 緩沖區是臨界資源,各進程必須互斥地訪問。
- PV操作題目分析步驟:
①、關系分析。找出題目中描述的各個進程,分析它們之間的同步、互斥關系。
②、整理思路。根據各進程的操作流程確定P、V操作的大致順序。【生產者每次要消耗§一個空閑緩沖區,并生產(V)一個產品。消費者每次要消耗(P)一個產品,并釋放一個空閑緩沖區V) 。往緩沖區放入/取走產品需要互斥。】
③、設置信號量。并根據題目條件確定信號量初值。(互斥信號量初值一般為1,同步信號量的初
始值要看對應資源的初始值是多少)
(一)能否改變相鄰P、V操作的順序?
- 若此時緩沖區內已經放滿產品,則 empty=0,full=n。
- 則生產者進程執行① 使mutex變為0,再執行②,由于已沒有空閑緩沖區,因此生產者被阻塞。
- 由于生產者阻塞,因此切換回消費者進程。消費者進程執行③,由于mutex為0,即生產者還沒釋放對臨界資源的“鎖”,因此消費者也被阻塞。
- 這就造成了生產者等待消費者釋放空閑緩沖區,而消費者又等待生產者釋放臨界區的情況,生產者和消費者循環等待被對方喚醒,出現“死鎖”。
- 同樣的,若緩沖區中沒有產品,即full=0,empty=n。按③④① 的順序執行就會發生死鎖。
- 因此, 實現互斥的P操作一定要在實現同步的P操作之后。
V操作不會導致進程阻塞,因此 兩個V操作順序可以交換。
- 生產者消費者問題是一個互斥、同步的綜合問題。
- 有時候是消費者需要等待生產者生產,有時候是生產者要等待消費者消費,這是兩個不同的“一前一后問題”,因此也需要設置兩個同步信號量。
二、多生產者—消費者問題
- 桌子上有一只盤子,每次只能向其中放入一個水果。爸爸專向盤子中放蘋果,媽媽專向盤子中放橘子,兒子專等著吃盤子中的橘子,女兒專等著吃盤子中的蘋果。只有盤子空時,爸爸或媽媽才可向盤子中放一個水果。僅當盤子中有自己需要的水果時,兒子或女兒可以從盤子中取出水果。
- 用PV操作實現上述過程。
(一)如何實現?
(二)問題:可不可以不用互斥信號量?
- 分析:剛開始,兒子、女兒進程即使上處理機運行也會被阻塞。如果剛開始是父親進程先上處理機運行,則:父親 P(plate),可以訪問盤子→母親 P(plate),阻塞等待盤子→父親放入蘋果V(apple),女兒進程被喚醒,其他進程即使運行也都會阻塞,暫時不可能訪問臨界資源(盤子)→女兒 P(apple),訪問盤子,V(plate),等待盤子的母親進程被喚醒à母親進程訪問盤子(其他進程暫時都無法進入臨界區)→……
- 結論:即使不設置專門的互斥變量mutex,也不會出現多個進程同時訪問盤子的現象
- 原因在于:本題中的緩沖區大小為1,在任何時刻,apple、orange、plate 三個同步信號量中最多只有一個是1。因此在任何時刻,最多只有一個進程的P操作不會被阻塞,并順利地進入臨界區…
(三)如果盤子(緩沖區)容量為2
- 父親 P(plate),可以訪問盤子→母親 P(plate),可以訪問盤子→父親在往盤子里放蘋果,同時母親也可以往盤子里放橘子。于是就出現了兩個進程同時訪問緩沖區的情況,有可能導致兩個進程寫入緩沖區的數據相互覆蓋的情況。
- 因此,如果緩沖區大小大于1,就必須專門設置一個互斥信號量 mutex 來保證互斥訪問緩沖區。
- 總結:在生產者-消費者問題中,如果緩沖區大小為1,那么有可能不需要設置互斥信號量就可以實現互斥訪問緩沖區的功能。當然,這不是絕對的,要具體問題具體分析。
- 建議:在考試中如果來不及仔細分析,可以加上互斥信號量,保證各進程一定會互斥地訪問緩沖區。但需要注意的是,實現互斥的P操作一定要在實現同步的P操作之后,否則可能引起“死鎖”
- PV 操作題目的解題思路:
①、關系分析。找出題目中描述的各個進程,分析它們之間的同步、互斥關系。
②、整理思路。根據各進程的操作流程確定P、V操作的大致順序。
③、設置信號量。設置需要的信號量,并根據題目條件確定信號量初值。(互斥信號量初值一般為1,同步信號量的初始值要看對應資源的初始值是多少)
- 解決“多生產者-多消費者問題”的關鍵在于理清復雜的同步關系。
- 在分析同步問題(一前一后問題)的時候不能從單個進程行為的角度來分析,要把“一前一后”發生的事看做是兩種“事件”的前后關系。
- 比如,如果從單個進程行為的角度來考慮的話,我們會有以下結論:
①、如果盤子里裝有蘋果,那么一定要女兒取走蘋果后父親或母親才能再放入水果
②、如果盤子里裝有橘子,那么一定要兒子取走橘子后父親或母親才能再放入水果 - 這么看是否就意味著要設置四個同步信號量分別實現這四個“一前一后”的關系了?
正確的分析方法應該從“事件”的角度來考慮,我們可以把上述四對“進程行為的前后關系”抽象為一對“事件的前后關系” - 盤子變空事件→放入水果事件。“盤子變空事件”既可由兒子引發,也可由女兒引發;“放水果事件”
- 既可能是父親執行,也可能是母親執行。這樣的話,就可以用一個同步信號量解決問題了
總結
以上是生活随笔為你收集整理的生产者消费问题以及多生产者—消费者问题实现思想的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 计算机研讨会通讯录,江苏学会网 中国力学
- 下一篇: 什么是图像噪声 ?