二元訊號量如何實現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”條件。

在這裡,它執行互斥鎖的等待和訊號操作,直到它變為真。

更新於:2021年12月2日

2K+ 閱讀量

啟動你的職業生涯

完成課程獲得認證

開始學習
廣告