PV原語
PV原語通過操作信號量來處理進程間的同步與互斥的問題。其核心就是一段不可分割不可中斷的程序。 其基本思路是用一種新的變量類型(semaphore)來記錄當前可用資源的數量。
semaphore有兩種實現方式:
- semaphore的取值必須大於或等於0。0表示當前已沒有空閒資源,而正數表示當前空閒資源的數量;
- semaphore的取值可正可負,負數的絕對值表示正在等待進入臨界區的進程個數。
信號量是由操作系統來維護的,用戶進程只能通過初始化和兩個標準原語(P、V原語)來訪問。初始化可指定一個非負整數,即空閒資源總數。
P原語:阻塞原語,負責把當前進程由運行狀態轉換爲阻塞狀態,直到另外一個進程喚醒它。操作爲:申請一個空閒資源(把信號量減1),若成功,則退出;若失敗,則該進程被阻塞;
V原語:喚醒原語,負責把一個被阻塞的進程喚醒,它有一個參數表,存放着等待被喚醒的進程信息。操作爲:釋放一個被佔用的資源(把信號量加1),如果發現有被阻塞的進程,則選擇一個喚醒之。
P原語操作的動作是:
- sem減1;
- 若sem減1後仍大於或等於零,則進程繼續執行;
- 若sem減1後小於零,則該進程被阻塞後進入與該信號相對應的隊列中,然後轉進程調度。
V原語操作的動作是:
- sem加1;
- 若相加結果大於零,則進程繼續執行;
- 若相加結果小於或等於零,則從該信號的等待隊列中喚醒一等待進程,然後再返回原進程繼續執行或轉進程調度。
PV操作對於每一個進程來說,都只能進行一次,而且必須成對使用。在PV原語執行期間不允許有中斷的發生。
P操作,原子減少S,然後如果S < 0,則阻塞當前線程
V操作,原子增加S,然後如果S <= 0,則喚醒一個阻塞的線程
信號量機制
(1) 整型信號量:不滿足“讓權等待”
(2) 記錄型信號量:只可申請一類資源,該資源有n個,一次只可申請一個。將資源分光,多類資源時易產生死鎖。
(3) AND型信號量:可申請n類資源,每類資源有m個,每次可申請每類資源中的一個。會將資源分光。
(4) 信號量集:可申請n類資源,每類資源有m個,每次可申請每類資源中的多個。但低於下限時,不予分配