Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> Linux 系統教學 >> Linux 教學

Linux 核心同步機制:臨界區、死鎖與信號量詳解

編輯:Linux 教學

在 Linux 核心開發中,並發控制是核心議題。理解臨界區、競爭狀態、同步原語與死鎖預防,是編寫高效、穩定核心代碼的基石。

核心並發基礎概念

  • 臨界區:訪問共享資源(全局變量、硬體寄存器、數據結構)的代碼段。多任務並發進入同一臨界區會導致數據競爭。
  • 競爭狀態:兩個或以上任務同時處於同一臨界區,導致執行結果依賴於調度順序的錯誤現象。
  • 同步:透過鎖、信號量、完成量等機制,協調並發任務對共享資源的有序訪問,避免競爭狀態。

死鎖成因與避免策略

死鎖分為自死鎖(同一任務重複請求不可重入鎖)與 ABBA 死鎖(任務 A 持有鎖 1 請求鎖 2,任務 B 持有鎖 2 請求鎖 1)。產生死鎖的四個必要條件(Coffman 條件):

  1. 互斥使用:資源同一時刻只能被一個任務佔用。
  2. 不可搶佔:已獲資源不可被強制奪走,只能主動釋放。
  3. 請求並保持:任務持有資源的同時請求新資源。
  4. 循環等待:任務鏈形成環狀等待關係。

避免方法:破壞任一條件即可。核心常用策略包括:鎖排序(統一獲取順序,破壞循環等待)、嘗試鎖(mutex_trylock 失敗即放棄,破壞請求並保持)、可搶佔鎖(RT 內核中鎖可被高優先級任務搶佔)以及鎖分級(細化鎖粒度,減少持有時間)。

核心並發來源

Linux 核心屬於搶佔式多任務系統,並發來源包含:

  1. 中斷:硬體中斷隨時打斷當前代碼,執行 ISR(中斷服務程序)。
  2. 核心搶佔:啟用 CONFIG_PREEMPT 後,核心態任務可被高優先級任務搶佔。
  3. 睡眠與用戶空間同步:任務因等待 I/O、鎖等事件睡眠,調度器切換至其他任務。
  4. 對稱多處理(SMP):多 CPU 核心真正並行執行代碼,需嚴格使用自旋鎖等 SMP 安全原語。

信號量機制詳解

Linux 信號量是睡眠鎖,適合長時間持有的場景(如文件系統操作)。源自 Dijkstra 1968 年經典 P/V 操作,對應核心 down()(P,獲取/減 1)與 up()(V,釋放/加 1)。

  • down():若計數器 > 0,遞減並繼續;否則將當前任務加入等待隊列並睡眠(TASK_UNINTERRUPTIBLE 或 TASK_INTERRUPTIBLE)。
  • up():遞增計數器,若等待隊列非空,喚醒一個任務(通常是 FIFO 順序)。

核心提供 struct semaphore、init_MUTEX()、down_interruptible()(可被信號打斷)等介面。注意:中斷上下文不可使用睡眠鎖,必須用自旋鎖或 local_bh_disable() 等機制。

Copyright © Windows教程網 All Rights Reserved