PV操作实例分析
//PV兩個字母是荷蘭文 Passeren(通過),Vrijgeven(釋放)的簡稱。
? ?
剛開始學習操作系統的時候,就聽說PV操作,簡單說說PV操作。
●??P(S):?S=S-1?
? ? ? ? ? ?如果S≥0,則該進程繼續執行;
? ? ? ? ? ? ? S<0,進程暫停執行,放入信號量的等待隊列
?
● ?V(S): S=S+1
? ? ? ? ? ? 如果S>0,則該進程繼續執行;
? ? ? ? ? ?? ? ?S≤0,?喚醒等待隊列中的一個進程
? ? 到底怎么分析,下面看看一個具體的問題:
? ??
首先設信號量S1,S2,其中
S1,表示是否允許司機啟動汽車,其初值為0,
S2,表示是否允許售票員開車門,初值為O;
? ? ? ? ??
● 分析:
? ? 司機進程:
? ? ? ? ? ? P:S1=S1-1?得:S1=0-1=-1<0 司機進程暫停執行,放入信號量的等待隊列(售票員進程)
?
? ?售票員進程:
? ? ? ? ? ?關車門;
? ? ? ? ? ?V:S1=S1+1得:S1=-1+1=0≤ 0 ?喚醒等待隊列中的一個進程
? ? (解釋:喚醒司機進程,使司機進程成為就緒狀態,司機可以啟動車輛,正常行駛,……,直到到V(S2),??S2=S2+1?得:S2=0+1=1>0?,司機進程在此時往下就沒有操作了;
在喚醒司機進程的同時,售票員可以售票,執行售票進程,到P(S2)。
如果之前司機進程到V(S2),這里P(S2):S2=S2-1得:S2=1-1=0 ≥?0,接著往下執行,到最后上下客;
如果之前司機進程未到V(S2),售票員的進程到P(S2),則如下進行)
? ? ? ? ? ?售票;(同時司機可能,啟動車輛;正常行駛;……)
? ? ? ? ? ?P:S2=S2-1得:S2=0-1=-1< 0 售票員進程暫停執行,放入信號量的等待隊列(運行司機進程)
?
? ?司機進程:? ?
? ? ? ? ?(接著上面未完成的繼續往下執行)
? ? ? ? ? 啟動車輛;
? ? ? ? ? 正常行駛;
? ? ? ? ? 到站停車;
? ? ? ? ? ?S2=S2+1 得:S2=-1+1=0≤ 0?喚醒等待隊列中的一個進程(運行售票員進程)
?
? ?售票員進程:
? ? ? ? 開車門;
? ? ? ? 上下客;
? ? 以上過程(可以是如下):
? ? ? ? ??
? ? ?在售票員進程進程到V(S1),往下售票的同時司機可以啟動車輛、……
● 使用PV操作實現進程同步時應該注意的是:
? ? (1)分析進程間的制約關系,確定信號量種類。在保持進程間有正確的同步關系情況下,哪個進程先執行,哪些進程后執行,彼此間通過什么資源(信號量)進行協調,從而明確要設置哪些信號量。
? ? (2)信號量的初值與相應資源的數量有關,也與P、V操作在程序代碼中出現的位置有關。
? ? (3)同一信號量的P、V操作要成對出現,但它們分別在不同的進程代碼中。
與50位技術專家面對面20年技術見證,附贈技術全景圖
總結
- 上一篇: Windows 全局钩子 Hook 详解
- 下一篇: Windows 钩子的使用