訊號量介紹


訊號量是一種具有兩個組成部分的資料型別:一組程序和一個非負整數,以及一個等待佇列。它用於解釋臨界區的問題,並透過使用兩個程序來解釋。暫停和訊號用於技術組織。它可以是一個變數,用於控制多個執行緒對共享資源的訪問,並避免像多工程序這樣的系統中的臨界區問題。訊號量允許計數共享資源,稱為計數訊號量。

操作級別

有一些級別可以幫助理解訊號量。這些級別如下:

  • 執行 - 它表示操作正在執行。

  • 就緒 - 它表示操作需要執行。

  • 空閒 - 當沒有程序正在執行時,操作處於此狀態。

  • 阻塞 - 程序可能未準備好進行分割操作。它可能由某些外圍事件觸發。

  • 完成 - 當一個程序執行完它的最終聲明後。

  • 非活動 - 操作在某個點被啟用。技術的早期階段。

初始化

訊號量S應該初始化為一個大於0的非負整數和一個空的程序集。

$$S<-(k,\phi)$$

訊號量

訊號量中的操作

以下是兩個原子操作:wait和signal,如下所示。

  • Wait - 根據非負整數的值,如果它有值,則減少它的值,並且程序p可以繼續執行;如果它是0,則程序p被插入到等待佇列中,並且程序p的狀態變為阻塞。在這種情況下,程序p被認為在訊號量上阻塞。

  • Signal - 根據程序集的值,如果它是空的,則增加整數的值;如果它不是空的,則釋放一個任意的程序,並將p的狀態改為完成。

訊號量在程序同步中的作用

訊號量是用於協調大型機中多個程序事件的同步機制。它們用於實現互斥、避免競爭狀態和執行程序間的同步。

wait操作減少訊號量的值,signal操作增加訊號量的值。它用於實現臨界區,即程式中只能由一個程序同時執行的區域。程序可以訪問共享資源,例如共享記憶體或輸入/輸出裝置。

訊號量的型別

有一些型別的訊號量,如下所示:

  • 一般訊號量 - 一個訊號量的程序集可以具有任意非負值的訊號量稱為一般訊號量。

  • 二元訊號量 - 一個訊號量的程序集只取值零和一的訊號量稱為二元訊號量,也稱為互斥鎖(mutex)。

  • 強訊號量 - 與弱訊號量不同,當非負整數透過等待佇列更改時,程序集保持不變。弱訊號量中未被通知的程序的移除可能導致飢餓,而在這裡,它不會發生飢餓。

    S<-(0, empty)

  • 忙等待訊號量 - 它可能不包含非負整數,訊號量S由一組操作識別。這種型別的訊號量在多處理器系統中使用,其中等待的程序獲得其處理器並且不浪費可能用於計算的中央處理單元時間。

訊號量的優點

  • 由於訊號量中的忙等待佇列,不會消耗程序時間和資源。這是因為程序只有在滿足特定條件後才能進入臨界區。

  • 使用者可以靈活地管理資源。

  • 它們不允許多個程序同時進入臨界區。實現了互斥,並且比其他同步機制更有效。

  • 使用者是與機器無關的,因為它們執行在微核心的與機器無關的程式中。

訊號量的缺點

  • 為了避免死鎖,signal() 和 wait() 操作必須以正確的順序執行。

  • 訊號量的編碼比較困難,並且可能無法實現互斥。

  • 當低優先順序程序比高優先順序程序更早訪問臨界區時,可能會出現優先順序反轉的情況。

結論

本文介紹了不同型別的訊號量、訊號量的優缺點。訊號量的主要缺點是需要忙等待佇列。如果一個程序在臨界區中,其他試圖進入臨界區的程序將必須等待,直到臨界區不再被任何程序佔用。一旦進入佇列,它就會不斷檢查訊號量的值並浪費CPU週期。

更新於:2023年5月15日

797 次瀏覽

開啟你的職業生涯

完成課程獲得認證

開始學習
廣告