互斥鎖和訊號量有什麼不同?(譯)

Sunxb發表於2022-05-10

原文地址

什麼是訊號量?

訊號量是一個非負變數, 並且線上程之間共享。訊號量是一種訊號機制,一個執行緒正在等待訊號量可以由另一個執行緒發出。它使用兩個原子操作,1)wait和 2)signal實現執行緒同步。

訊號量實現允許或不允許訪問資源,這取決於它的設定方式。

什麼是互斥鎖?

互斥的完整形式是互斥物件。它是一種特殊型別的二進位制訊號,用於控制對共享資源的訪問。它包含了一個優先順序繼承機制來避免擴充套件優先順序反轉問題。它允許當前優先順序較高的任務在儘可能短的時間內保持在阻塞狀態。然而,優先順序繼承並不能解決優先順序反轉問題,只能最小化其影響。

主要區別:
互斥鎖是一種鎖機制,訊號量是一種訊號機制
互斥鎖是一個物件,訊號量是一個整數
互斥鎖沒有子型別,訊號量有兩種子型別,計數訊號量和二進位制訊號量
訊號量支援wait和signal操作修改,而互斥鎖僅能由可能請求或釋放資源的程式修改
訊號量的值使用wait()signal()這兩個方法修改,而互斥鎖使用lock和unlock來操作。

使用訊號量

在單個緩衝區的情況下,我們可以將4KB的緩衝區分成四個1KB的緩衝區。訊號量可以與這四個緩衝區相關聯。這允許使用者和生產者同時在不同的緩衝區上工作。

使用互斥鎖

互斥鎖提供了互斥的功能,不管是生產者還是消費者,都可以持有鎖,持有鎖的一方可以繼續工作,另一方就要等待,在同一時間,只有一個執行緒可以處理整個緩衝區。

關於互斥和訊號量的常見事實

  • 只有一個任務可以獲取到互斥鎖,互斥鎖有所有權,只有持有鎖的任務才能釋放互斥鎖。
  • 使用互斥鎖和訊號量的場景是不同的,但是因為實現方式有相似之處,互斥鎖也被稱為二進位制訊號量
  • 一個眾所周知的錯誤:互斥量和訊號量幾乎相同,唯一的區別是互斥量能夠計數到1,而訊號量能夠從0計數到N
  • 二進位制訊號量和互斥量之間總是存在不確定性。你可能聽說互斥鎖是一個二進位制訊號量,這是不正確的

訊號量的優點

  • 允許多個執行緒訪問臨界區
  • 訊號量是獨立於機器的(因為它們是在核心服務中實現的)
  • 不允許多個程式進入臨界區。
  • 訊號量有忙等狀態,因為不會浪費時間和資源

互斥鎖的優點

  • 互斥鎖只是簡單的鎖,在進入臨界區是持有它,離開時釋放
  • 由於在任何給定時間只有一個執行緒處於臨界區內,因此不存在資料競爭,可以始終保持資料一致性

訊號量的缺點

  • 訊號量的最大限制之一是優先順序反轉問題
  • 作業系統必須跟蹤所有訊號量的呼叫
  • 為了避免訊號量中的死鎖,waitsignal操作需要以正確的順序執行
  • 訊號量程式設計是一種複雜的方法,因此有可能無法實現互斥的效果
  • 它也不是可以大規模使用的實用方法,因為它們的使用會破壞模組化
  • 程式設計師使用訊號量更容易出錯,容易出現死鎖

互斥鎖的缺點

  • 如果一個持有鎖的執行緒休眠或者被強佔了CPU,其他執行緒就沒辦法繼續執行了
  • 一次只能允許一個執行緒訪問臨界區
  • 正常實現可能會導致忙等待狀態,浪費CPU時間

相關文章