操作的系統的PV操作


轉自:https://blog.csdn.net/sunlovefly2012/article/details/9396201

在操作系統中,進程之間經常會存在互斥(都需要共享獨占性資源時) 和同步(完成異步的兩個進程的協作)兩種關系.為了有效的處理這兩種情況,狄克斯特拉(W.Dijkstra)在1965年提出信號量 (semaphore)和PV操作.

    信號量:

    信號量是一種特殊的變量,實際上就是用來控制進程狀態的一個代表某一資源的存儲單元。表現形式是一個整型S和一個隊列.

    PV操作:

    P操作和V操作是執行時不被打斷的兩個操作系統原語。執行P操作P(S)時信號量S的值減1,若結果不為負則P(S)執行完畢,否則執行P操作的進程暫停以等待釋放。執行V操作V(S)時,S的值加1,若結果不大於0則釋放一個因執行P(S)而等待的進程.

    P操作:也稱為down()/wait()操作,使S=S-1,若S<0,進程暫停執行,放入信號量的等待隊列.

    V操作:也稱為up()/signal()操作,使S=S+1,若S<=0,喚醒等待隊列中的一個進程.

(1)完成互斥控制:

    為了保護共享資源,不讓多個進程同時訪問這個共享資源,換句話說,就是阻止多個進程同時進入訪問這些資源的代碼段,這個代碼段稱為臨界區(也稱為管程),這種一次只允許一個進程訪問的資源稱為臨界資源.為了實現進程互斥地進入自己的臨界區,代碼可以如下所示:

P(信號量S)

    ......

    臨界區(訪問臨界資源的代碼段)

    ......

V(信號量S)

    由於只允許一個進程進入,因此信號量中整型值的初始應設為1.該值表示可以允許多少個進程進入,當該值<0時,其絕對值就是等待使用臨界資源的進程數,也就是等待隊列中的進程數.而當一個進程從臨界區出來時,就會將整型值加1,如果等待隊列中還有進程,則調入新的進程進入(喚醒).

(2)完成同步操作

    最簡單的同步形式是:進程A在另一個進程B到達L2以前,不該不該前進到超過L1,這樣就可以使用以下程序表示:

進程A                                                    進程B

......                                                         ......

L1:P(信號量S)                                      L2:V(信號量S)

......                                                        ......

    因此,要確保進程B執行V操作之前,不讓進程A的運行超過L1,因此信號量的初值就應該為0.這樣,如果進程A先執行到L1,那么執行P操作后,信號量的整型值就會小於1,也就停止執行.直到進程B執行到L2時,將信號量的整型值加1,並喚醒它以繼續執行.

 

備注:中國讀者常常不明白這一同步機制為什么叫PV操作,原來這是狄克斯特拉用荷蘭文定義的,因為在荷蘭文中,通過叫passeren,釋放叫vrijgeven,PV操作因此得名。這是在計算機術語中不是用英語表達的極少數的例子之一。


免責聲明!

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



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