PV操作示例詳解


轉發自:https://blog.csdn.net/wuxy720/article/details/78936912

信號量機制:
1965年,荷蘭學者DIJKSTRA提出的信號量機制是一種卓有成效的進程同步工具。在長期且廣泛的應用中,信號量機制又得到了很大的發展。

信號量的作用:
控制共享資源的使用權(滿足互斥條件)
標志某事件的發生
使兩個或兩個以上的進程的行為同步
信號量的實質:
像是一把鑰匙,進程要運行下去,需要先拿到這把鑰匙,通俗點來講就是在允許的信號量下,進程才能夠執行。

接下來,我們就來看看如何通過操作信號量,來實現控制進程的執行。

PV的操作:
pv操作:就是來解決互斥與同步的問題的。PV操作是分開來看的。
首先來看P操作(申請資源操作)(等待信號量):

信號量有效(值>0)
信號量值減1
任務繼續運行
信號量值=0
等待信號量的進程被列入等待信號量進程列表。
可以理解為:
if ( (s = s - 1) >= 0 )
繼續執行本進程;
else
掛起本進程/本進程等待;

然后再來看V操作(釋放資源操作

沒有進程等待信號量
信號量的值加1
有進程等待信號量
信號量的值加1
等待的其中一個進程進入就緒狀態
可以理解為:
if ( (s = s + 1) >0 )
不喚醒s的隊列中的等待進程;
else // (s = s + 1) <= 0
喚醒s的隊列中的等待進程;
繼續執行本進程;

我們簡單的記住這個原理,然后我們通過一個例子來解釋,什么是PV操作。
公交車司機與售票員的問題:

我在圖上畫了步驟,接下來我們嚴格按照步驟來一步一步走。

首先,我們在司機進程使用P操作(S1=S1-1=-1),現在是S1的值為-1,我們來查看P操作發現應該 掛起本進程,也就是說司機進程暫時掛起,我們進入到售票員進程。
進入售票員進程后,我們先 關車門,然后我們進行V操作(S1=S1+1=0),發現滿足V操作的else,我們首先喚醒司機進程,然后我們繼續執行售票員進程。
接着售票,售票后我們執行P操作(S2=S2-1=-1),發現滿足P操作的else,我們暫時將售票員進程掛起。
進入到司機進程。
啟動車輛,正常行駛,到站停車,執行V操作(S2=S2+1=0),發現S2滿足V操作的else,喚醒售票員進程,同時繼續執行本進程。
但是,我們可以發現司機進程已經執行完了,但是等待隊列中還有售票員進程,我們就進入到售票員進程
在售票員進程中,開車門,上下客。整個司機與售票員問題結束。
關於PV操作容易產生的一些疑問:

1,S大於0那就表示有臨界資源可供使用,為什么不喚醒進程?

S大於0的確表示有臨界資源可供使用,也就是說這個時候沒有進程被阻塞在這個資源上,所以不需要喚醒。

2,S小於0應該是說沒有臨界資源可供使用,為什么還要喚醒進程?

V原語操作的本質在於:一個進程使用完臨界資源后,釋放臨界資源,使S加1,以通知其它的進程,這個時候如果S<0,表明有進程阻塞在該類資源上,因此要從阻塞隊列里喚醒一個進程來“轉手”該類資源。比如,有兩個某類資源,四個進程A、B、C、D要用該類資源,最開始S=2,當A進入,S=1,當B進入S=0,表明該類資源剛好用完, 當C進入時S=-1,表明有一個進程被阻塞了,D進入,S=-2。當A用完該類資源時,進行V操作,S=-1,釋放該類資源,因為S<0,表明有進程阻塞在該類資源上,於是喚醒一個。

3,如果是互斥信號量的話,應該設置信號量S=1,但是當有5個進程都訪問的話,最后在該信號量的鏈表里會有4個在等待,也是說S=-4,那么第一個進程執行了V操作使S加1,釋放了資源,下一個應該能夠執行,但喚醒的這個進程在執行P操作時因S<0,也還是執行不了,這是怎么回事呢?

當一個進程阻塞了的時候,它已經執行過了P操作,並卡在臨界區那個地方。當喚醒它時就立即進入它自己的臨界區,並不需要執行P操作了,當執行完了臨界區的程序后,就執行V操作。

4,S的絕對值表示等待的進程數,同時又表示臨界資源,這到底是怎么回事?

當信號量S小於0時,其絕對值表示系統中因請求該類資源而被阻塞的進程數目.S大於0時表示可用的臨界資源數。注意在不同情況下所表達的含義不一樣。當等於0時,表示剛好用完。

在最后,我們可以發現,我們是嚴格按照之前的PV操作的定義執行的,其實我們身邊很多例子都是這樣一步步實現的,只要多發現,用這種計算機思想來思考,是可以得到很多鍛煉的。
————————————————
版權聲明:本文為CSDN博主「wuxy720」的原創文章,遵循 CC 4.0 BY-SA 版權協議,轉載請附上原文出處鏈接及本聲明。
原文鏈接:https://blog.csdn.net/wuxy720/article/details/78936912

 


免責聲明!

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



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