Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學

Linux 核心同步機制深度解析:自旋鎖、信號量、RCU 與記憶體屏障

編輯:Linux 系統常見問題解答

核心同步導論

關鍵概念

  • 臨界區: 存取共享資料的程式碼區段。
  • 競爭條件: 多執行緒同時進入臨界區導致資料不一致。
  • 同步: 防止競爭條件的機制。
  • 死鎖: 循環等待資源,四必要條件:互斥、佔有並等待、非搶佔、循環等待。
  • 自死鎖: 同一執行緒重複請求不可遞迴鎖。
  • 飢餓: 長期無法獲得資源。

並發來源

  1. 中斷(隨時打斷)
  2. 軟中斷/Tasklet(核心排程喚醒)
  3. 核心搶佔(高優先級搶佔)
  4. 睡眠/用戶空間同步(調度切換)
  5. SMP 多處理器並行執行

避免死鎖原則

  • 固定鎖獲取順序,記錄文件化
  • 確保等待條件最終會結束
  • 避免重複請求同一鎖
  • 設計越簡單越不易死鎖

鎖粒度

粗粒度鎖保護大範圍資料(易爭用),細粒度鎖保護小資料結構(並行度高)。頻繁爭用時需細化粒度,多核心下效能提升明顯。

同步方法詳解

原子操作

不可分割指令,atomic_t 整數與位元操作,無需鎖,適用簡單計數器。

自旋鎖

忙等待,適合極短臨界區(不睡眠、不耗時)。注意:不可遞迴、獲取前必須關閉本地中斷(防中斷處理常同樣請求鎖造成死等)。下半部/Tasklet/軟中斷共享資料時需搭配 spin_lock_irqsave/spin_lock_bh 等變體。

讀寫自旋鎖

讀共享/寫獨享,適合「讀多寫少」場景,保留自旋特性。

信號量

睡眠鎖,爭用時進入等待隊列睡眠,釋放 CPU。適用長時間持有鎖的場景。只能在程序上下文使用(中斷上下文不可睡眠)。持有信號量時可睡眠,但不可同時持有自旋鎖。互斥信號量(計數=1)最常用。

讀寫信號量

類比讀寫自旋鎖,但爭用時睡眠而非自旋。

互斥體

簡化版信號量,嚴格擁有權語意,僅持有者可釋放,支援優先權繼承,防止優先權反轉。

完成變數

單次事件通知,wait_for_completion/complete,適合驅動程式初始化同步。

順序鎖

寫者獨佔,讀者無鎖但需重試(檢查序號),適用「寫少讀多、資料結構小」場景。

RCU (Read-Copy-Update)

極致讀端零開銷,寫端複製修改後原子替換指標,舊副本延遲釋放(等待所有預存讀者退出)。適用極度讀多寫少的全域資料結構。

選擇正確同步原語,是核心開發效能與正確性的關鍵。

Copyright © Windows教程網 All Rights Reserved