二元訊號量如何實現n個程序之間的互斥?
訊號量是一個共享變數,用於在系統程序之間實現互斥。它主要用於解決臨界區問題,是一種實現程序同步的技術。
訊號量有兩種型別,如下所示:
二元訊號量 - 只能取兩個值,0 或 1,這意味著一次只有一個程序可以進入臨界區。訊號量初始化為 1。
計數訊號量 - 可以取任何非負值 N,這意味著一次最多可以有 N 個程序進入臨界區。訊號量初始化為 N。
臨界區由 P 和 V 操作包圍,如下所示:
P(s)
臨界區 (CS)
V(s)
每個操作的定義如下:
Wait(P) - 當一個程序進入臨界區時,首先執行 P 操作,它會減少訊號量的值,如果之後 s >= 0,則進入臨界區,否則新增到等待佇列。
P(Semaphore s) { s = s - 1; if (s < 0) { block(p); } }
Signal(V) - 當一個程序退出臨界區時,執行 V 操作,它會增加訊號量的值,表示另一個當前被 P 操作阻塞的程序可以進入臨界區。
V(Semaphore s) { s = s + 1; if (s >= 0) { wakeup(p); } }
現在讓我們看看如何使用二元訊號量來實現n個程序之間的互斥。
我們知道,訊號量是一個變數,可以用來控制多程序在多工作業系統中對公共資源的訪問。根據題意,如果有多個程序共享一個訊號量,那麼程序分配是基於以下演算法組織的。
do { wait(mutex); signal(mutex); } while (true);
說明
它使用 do-while 迴圈處理,這意味著它執行“do”條件,直到滿足“while”條件。
在這裡,它執行互斥鎖的等待和訊號操作,直到它變為真。
廣告