生产者-消费者问题(有例题!!!)
文章目錄
- 前言
- 問題描述
- 如何實現
- 思考:能否改變相鄰P、V操作的順序?
- 知識回顧與重要考點
前言
此篇文章是我在B站學習時所做的筆記,大部分圖片都是課件老師的PPT,方便復習用。此篇文章僅供學習參考。
提示:以下是本篇文章正文內容
問題描述
系統中有一組生產者進程和一組消費者進程,生產者進程每次生產一個產品放入緩沖區,消費者進程每次從緩沖區中取出一個產品并使用。(注:這里的“產品”理解為某種數據)
- 生產者、消費者共享一個初始為空、大小為n的緩沖區。
- 只有緩沖區沒滿時,生產者才能把產品放入緩沖區,否則必須等待。
- 只有緩沖區不空時,消費者才能從中取出產品,否則必須等待。
- 緩沖區是臨界資源,各進程必須互斥地訪問。
解釋:
在剛開始,由于這個緩沖區全部是空的,所以生產者進程可以生產一些產品,把它放入到這個緩沖區當中。那一直到這個緩沖區被充滿了之后,如果此時生產者進程,它還想繼續生產產品,并且把它充入緩沖區的話,那這個行為很顯然應該是被阻止的,因為此時緩沖區的這些數據已經被裝滿了,那只有這個緩沖區騰出別的空閑的空間之后,生產者進程才可以繼續往里邊放出去,所以在這個時候,只能切換為消費者進程來消費這些數據,也就是從緩沖區當中取走其中的一些產品或者說數據,只要緩沖區當中有一個或者大于一個的空閑的空間,那么此時就可以喚醒生產者進程,讓他從阻塞態又重新回到就緒隊列,當然這個喚醒并不意味著生產者進程就立即回處理機運行,它只是回到了就緒隊列而已,所以接下來有可能是消費者進程繼續執行那么每一次每一輪執行都會從緩沖區取走一輪,并且使用,那一直到這個緩沖區被取空了之后,如果此時消費者進程還繼續嘗試從緩沖區當中取走產品的話,那由于此時已經為空了,那么這個時候這個取產品的行為,應該是被阻止了,所以消費者進程應該被阻塞,而只有生產的進程再往里邊放數據的時候,消費者進程才可以在重新被喚醒,又重新回到了就是就緒隊列,這個緩沖區它屬于一種臨界資源,各個進程是必須互斥的訪問的,假如說我們的這個系統當中有兩個生產者競爭,那此時這兩個生產者進程在檢查了之后,發現緩沖區的這些位置,每個地方都是空的,那這個生產者進程他可能就往這個位置,充入了一個它自己的產品,也就是數據,而另一個生產者進程在之前的那個檢查當中也發現這個緩沖區所有的地方都是空的,那么在并發的環境下,就有可能導致這個生產者進程,它同時也在檢查了之后,也往這個地方充入了一個數據,所以這就導致了前者的數據背后的數據給覆蓋的情況,因此我們是必須保障緩沖區是被互斥地訪問的。
PV操作題目分析步驟:
生產者每次要消耗(P)一個空閑緩沖區,并生產(V)一個產品。
消費者每次要消耗(P)一個產品,并釋放一個空閑緩沖區(V)。
[第一個P和第二個V是一對,第二個P和第一個V是一對]
往緩沖區放入/取走產品需要互斥。
如何實現
思考:能否改變相鄰P、V操作的順序?
- 若此時緩沖區內已經放滿產品,則empty=0,full=n。
- 則生產者進程執行①使mutex變為0,再執行②,由于已沒有空閑緩沖區,因此生產者被阻塞。由于生產者阻塞,因此切換回消費者進程。消費者進程執行③,由于mutex為0,即生產者還沒釋放對臨界資源的“鎖”,因此消費者也被阻塞。
- 這就造成了生產者等待消費者釋放空閑緩沖區,而消費者又等待生產者釋放臨界區的情況,生產者和消費者循環等待被對方喚醒,出現“死鎖”。
- 同樣的,若緩沖區中沒有產品,即full=0,empty=n。按③④①的順序執行就會發生死鎖。
因此,實現互斥的P操作一定要在實現同步的P操作之后。 V操作不會導致進程阻塞,因此兩個V操作順序可以交換。
接下來我們再來考慮第三個問題:生產者生產產品和消費者使用產品。這兩個操作,它們都是放在各自的這些pv操作之外的,那這些操作能不能放到pv操作之內呢?
答:其實邏輯上來看是沒有問題的,我們可以讓消費者從緩沖區取出一個產品之后,就立即緊接著使用產品。但這會導致臨界區的這個代碼量變大,那么消費者進程在訪問臨界區的過程當中,就需要耗費更長的時間。那如果此時有別的進程也想訪問臨界區的話,它是會被阻塞的,所以說如果把這些非必要的代碼把它也放到臨界區內的話,就顯然會導致進程之間的并發度降低,所以對于這兩部分的大碼,我們最好不要放到pv操作之間。
知識回顧與重要考點
PV操作題目的解題思路:
- 生產者消費者問題是一個互斥、同步的綜合問題。
- 對于初學者來說最難的是發現題目中隱含的兩對同步關系。
- 有時候是消費者需要等待生產者生產,有時候是生產者要等待消費者消費,這是兩個不同的“一前一后問題”,因此也需要設置兩個同步信號量。
總結
以上是生活随笔為你收集整理的生产者-消费者问题(有例题!!!)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从入门到深入!java游戏口袋精灵
- 下一篇: 物联网安全技术——思维导图