訊號量如何用於實現互斥?


訊號量是一個共享變數,用於實現系統程序之間的互斥。它主要用於解決臨界區問題,是一種實現程序同步的技術。

訊號量主要有以下兩種型別:

  • 二元訊號量 - 只能取0或1兩個值,這意味著一次只有一個程序可以進入臨界區。訊號量初始化為1。

  • 計數訊號量 - 可以取任何非負值N,這意味著一次最多可以有N個程序進入臨界區。訊號量初始化為N。

臨界區由P和V操作包圍,如下所示:

  • P(s)

  • 臨界區 (CS)

  • V(s)

每個操作的定義如下:

等待(P) - 當一個程序進入臨界區時,它首先執行P操作,該操作會減少訊號量的值;如果之後s>=0,則進入臨界區;否則加入等待佇列。

P(Semaphore s)
{
   s = s - 1;
   if (s < 0) {
      block(p);
   }
}

訊號(V) - 當一個程序退出臨界區時,執行V操作,該操作會增加訊號量的值,表明另一個當前被P操作阻塞的程序可以進入臨界區。

V(Semaphore s)
{
   s = s + 1;
   if (s >= 0) {
      wakeup(p);
   }
}

讓我們看看如何使用鎖變數來引入互斥:

它使用與訊號量類似的機制,但一次只有一個程序可以進入臨界區,並使用鎖變數來實現同步,如下所示:

while(lock != 0);
Lock = 1;
//critical section
Lock = 0;

它檢查鎖是否等於0,如果是,則將鎖設定為1,表示鎖已被佔用,然後進入臨界區。如果鎖不為0,則等待直到鎖可用。退出臨界區時,將鎖恢復為0,表示鎖可用,另一個程序可以進入臨界區。

鎖和訊號量的區別在於,鎖可以在使用者模式下實現,而訊號量在核心模式下實現。此外,鎖只允許一個程序進入臨界區,而訊號量可以允許多個程序進入臨界區。簡而言之,訊號量是鎖的泛化。

更新於:2021年12月1日

7K+ 瀏覽量

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告