PV操作原理和實現

PV原語

PV原語通過操作信號量來處理進程間的同步與互斥的問題。其核心就是一段不可分割不可中斷的程序。 其基本思路是用一種新的變量類型(semaphore)來記錄當前可用資源的數量。

semaphore有兩種實現方式:

  1. semaphore的取值必須大於或等於0。0表示當前已沒有空閒資源,而正數表示當前空閒資源的數量;
  2. semaphore的取值可正可負,負數的絕對值表示正在等待進入臨界區的進程個數。

信號量是由操作系統來維護的,用戶進程只能通過初始化和兩個標準原語(P、V原語)來訪問。初始化可指定一個非負整數,即空閒資源總數。

P原語:阻塞原語,負責把當前進程由運行狀態轉換爲阻塞狀態,直到另外一個進程喚醒它。操作爲:申請一個空閒資源(把信號量減1),若成功,則退出;若失敗,則該進程被阻塞;

V原語:喚醒原語,負責把一個被阻塞的進程喚醒,它有一個參數表,存放着等待被喚醒的進程信息。操作爲:釋放一個被佔用的資源(把信號量加1),如果發現有被阻塞的進程,則選擇一個喚醒之。

P原語操作的動作是:

  1. sem減1;
  2. 若sem減1後仍大於或等於零,則進程繼續執行;
  3. 若sem減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。

V原語操作的動作是:

  1. sem加1;
  2. 若相加結果大於零,則進程繼續執行;
  3. 若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。

PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執行期間不允許有中斷的發生。

P操作,原子減少S,然後如果S < 0,則阻塞當前線程
V操作,原子增加S,然後如果S <= 0,則喚醒一個阻塞的線程

信號量機制

(1) 整型信號量:不滿足“讓權等待”
(2) 記錄型信號量:只可申請一類資源,該資源有n個,一次只可申請一個。將資源分光,多類資源時易產生死鎖。
(3) AND型信號量:可申請n類資源,每類資源有m個,每次可申請每類資源中的一個。會將資源分光。
(4) 信號量集:可申請n類資源,每類資源有m個,每次可申請每類資源中的多個。但低於下限時,不予分配

發佈了75 篇原創文章 · 獲贊 38 · 訪問量 2萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章