操作系統學習筆記:PV同步原語

最近開始學習操作系統原理,裏面涉及到一種進程同步技術:PV原語。

PV原語是一種操作系統底層提供的同步技術,能夠有效的降低多進程併發資源競爭,類比多線程同步,也是如此。

PV原語採用了諸多原子級別的操作【原子級別指的是,該操作在CPU看來是一個基本操作,無可打斷,即使是最高優先級的中斷到來,在這條指令執行期間,也必須等待,基本上任何中斷才做只能在這條指令開始之前或者完成之後在執行】保證CPU不會因爲中斷問題和切換問題而產生衝突,造成操作中斷,丟失數據。

前文《操作系統運轉機制核心原理》中提到,操作系統是一個事件驅動型的軟件系統,他有一個顯著的特點,將所有操作劃分爲各個基本任務,對於每個基本任務都會進行合理調度。系統在進行任務切換的時候有兩種方式,一種是系統響應外部事件,進行強實時性的切換,包括外部信號,時鐘信號;另一種就是軟件自行放棄執行,返回調度程序進行切換。在前文中,提到系統在運行一個程序的時候是在內核空間和用戶空間不斷的切換的,這種切換就是程序自行放棄執行操作的實例,一般發生在對資源的請求上,俗稱內陷。

PV同步原語應用的領域就是內陷操作上。當系統調用各種資源(設備資源,臨界資源)的時候,他會自動(編譯時候自動添加)調用PV原語保存CPU現場資源到任務塊,再次回來的時候,好用來恢復現場。

PV原語的基本構造:

P(sem){
    sem = sem-1;
    if(sem < 0){
        保護當前進程CPU現場;
        當前進程狀態設置爲“等待”;
        將當前進程插入信號sem等待隊列;
        轉調度程序;
    }
}

V(sem){
    sem = sem + 1;
    if (sem < = 0){
        從sem等待隊列中喚醒一個等待者;
    }
}

他們是如何調度的呢?
舉個例子多個進程爭搶同一個資源的時候,sem與資源數量保持一致,也就是sem=1。當sem=1的時候,多個進程並行執行。其中一個進程執行P操作,首先將sem-1【int類型的自增自減是原子操作】,之後對sem進行判斷【原子操作】,如果sem<0說明資源被佔用,當前進程保護CPU現場,自行掛起,保持沉默。唯一搶到執行權的也就是第一個進程繼續執行,之後sem+1,表示釋放了臨界資源。資源釋放之後肯定發現sem<=0,這時候,他就會喚起一個等待者。最妙的是,這個時候,這個進程的P操作已經執行完了,不會再判斷了。也就繼續執行內部代碼,直到最後執行V操作。周而復始,調度的公平性有賴於系統調度算法。

PV原語與鎖LOCK機制的最大不同在於。PV原語會讓搶不到資源的進程沉默,而執行完成之後,又會弔起一個沉默的進程,周而復始。而鎖機制並不會沉默當前進程,容易造成其他進程餓死的現象。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章