PV操作
P操作和V操作是不可中斷的程序段,稱為原語,PV原語及信號量的概念都是由荷蘭科學(xué)家E.W.Dijkstra提出的。
信號量sem是一個(gè)整數(shù),Sem大于等于零時(shí)代表可供并發(fā)進(jìn)程使用的資源實(shí)體數(shù),sem小于零時(shí)則表示正在等待申請資源的進(jìn)程數(shù)。
P原語操作
(1)sem減 1 ;
(2)若sem大于等于0,則請求的進(jìn)程繼續(xù)執(zhí)行;
(3)若sem小于0,則進(jìn)程被阻塞后進(jìn)入與該信號相對應(yīng)的等待隊(duì)列中,然后轉(zhuǎn)進(jìn)程調(diào)度。
V原語操作
(1)sem加 1 ;
(2)若sem大于0,則請求的進(jìn)程繼續(xù)執(zhí)行;
(3)若sem小于等于0,則從該信號的等待隊(duì)列中喚醒一個(gè)等待進(jìn)程,然后再返回原進(jìn)程繼續(xù)執(zhí)行或轉(zhuǎn)進(jìn)程調(diào)度。
注意事項(xiàng):
⑴每個(gè)程序中用戶實(shí)現(xiàn)互斥的P、V操作必須成對出現(xiàn),先做P操作,進(jìn)臨界區(qū),后做V操作,出臨界區(qū)。若有多個(gè)分支,要認(rèn)真檢查其成對性。
⑵P、V操作應(yīng)分別緊靠臨界區(qū)的頭尾部,臨界區(qū)的代碼應(yīng)盡可能短,不能有死循環(huán)。
⑶互斥信號量的初值一般為1。
典型問題:
1、V操作中 ,Sem大于0那就表示有可供使用,為什么不喚醒進(jìn)程?
==》Sem大于0的確表示有臨界資源可供使用,而且這個(gè)時(shí)候沒有進(jìn)程被阻塞在這個(gè)資源上,也就是說沒有進(jìn)程因?yàn)榈貌坏竭@類資源而阻塞,所以沒有被阻塞的進(jìn)程,自然不需要喚醒。
2、V操作中 ,Sem小于等于0應(yīng)該是說沒有臨界資源可供使用,為什么還要喚醒進(jìn)程?
==》V原語操作的本質(zhì)在于:一個(gè)進(jìn)程使用完臨界資源后,釋放臨界資源,使Sem加1,以通知其它的進(jìn)程。這個(gè)時(shí)候如果Sem<=0,表明有進(jìn)程阻塞在該類資源上,因此要從等待隊(duì)列里喚醒一個(gè)進(jìn)程來“轉(zhuǎn)手”該類資源。
比如,有兩個(gè)某類資源,四個(gè)進(jìn)程A、B、C、D要用該類資源,最開始Sem=2,當(dāng)A進(jìn)入,Sem=1;當(dāng)B進(jìn)入Sem=0,表明該類資源剛好用完;當(dāng)C進(jìn)入時(shí)Sem=-1,表明有一個(gè)進(jìn)程被阻塞了;D進(jìn)入,Sem=-2。當(dāng)A用完該類資源時(shí),進(jìn)行V操作,Sem=-1,釋放該類資源,而這時(shí)Sem<=0,表明有進(jìn)程阻塞在該類資源上,于是喚醒一個(gè)。
3、Sem的絕對值表示等待的進(jìn)程數(shù),同時(shí)又表示臨界資源,這到底是怎么回事?
==》當(dāng)信號量Sem小于0時(shí),其絕對值表示因請求該類資源而被阻塞的進(jìn)程數(shù)目。S大于0時(shí)表示可用的臨界資源數(shù)。注意在不同情況下所表達(dá)的含義不一樣。當(dāng)S等于0時(shí),表示臨界資源剛好用完。
4、如果是互斥的話,應(yīng)該設(shè)置信號量Sem=1,但是當(dāng)有5個(gè)進(jìn)程都訪問的話,最后在該信號量的鏈表里會有4個(gè)在等待,也是說S=-4,那么第一個(gè)進(jìn)程執(zhí)行了V操作使S加1,釋放了資源,下一個(gè)應(yīng)該能夠執(zhí)行,但喚醒的這個(gè)進(jìn)程在執(zhí)行P操作時(shí)因S<0,也還是執(zhí)行不了,這是怎么回事呢?
==》當(dāng)一個(gè)進(jìn)程阻塞了的時(shí)候,它已經(jīng)執(zhí)行過了P操作,并卡在那個(gè)地方。當(dāng)喚醒它時(shí)就立即進(jìn)入它自己的臨界區(qū),并不需要執(zhí)行P操作了,當(dāng)執(zhí)行完了臨界區(qū)的程序后,就執(zhí)行V操作。
參考自:PV操作原理概述-dyli2000-ChinaUnix博客
總結(jié)
- 上一篇: freopen()重定向的打开和关闭
- 下一篇: 托马斯微积分13版原版pdf