Linux 內核同步管理全解:原理 + 實戰 + 考點


🔥 推薦:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
京東正版促銷,歡迎支持原創!
鏈接:https://item.jd.com/15020438.html




一、為什么需要同步機制?

Linux 是一個支持 多核并發 + 搶占式調度 的操作系統,多個內核線程可能同時訪問同一份內存區域,例如:驅動共享某個全局變量、文件系統緩存讀寫、網絡緩沖區處理等等。

如果沒有同步機制,就會產生競態條件(Race Condition),導致數據錯亂、內核崩潰甚至安全漏洞。

因此,Linux 內核實現了一整套高效的同步機制,用來協調不同 CPU、不同執行上下文之間對共享資源的訪問。


二、Linux 中的主要同步機制

同步機制是否可睡眠適用場景常見用法內核位置
原子變量簡單計數/標志狀態標志、自增自減include/linux/atomic.h
自旋鎖中斷處理、短臨界區硬件寄存器、短時間保護include/linux/spinlock.h
信號量多資源管理限制并發訪問數include/linux/semaphore.h
互斥鎖臨界區保護普通數據結構保護include/linux/mutex.h
RCU部分讀者無鎖讀多寫少的表結構任務列表、網絡表項kernel/rcu/

三、五種同步機制逐一講解

3.1 原子變量

? 場景:狀態標志、自增計數器
atomic_t count;
atomic_set(&count, 0);atomic_inc(&count);  // ++count
atomic_dec(&count);  // --countif (atomic_read(&count) == 0) {// 說明資源清空或條件滿足
}
  • 原子變量適合簡短邏輯,如計數器、標志位。
  • 不適合保護復雜數據結構。
? 面試考點:
  • 原子變量是否需要鎖?→ 否。
  • 原子操作能否用于中斷上下文?→ 可以。

3.2 自旋鎖(Spinlock)

? 場景:短時間保護、中斷上下文
spinlock_t my_lock;
spin_lock_init(&my_lock);spin_lock(&my_lock);
/* 訪問共享資源 */
spin_unlock(&my_lock);

在這里插入圖片描述


🔥 推薦:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
京東正版促銷,歡迎支持原創!
鏈接:https://item.jd.com/15020438.html



? 中斷安全版本:
unsigned long flags;
spin_lock_irqsave(&my_lock, flags);
/* 臨界區 */
spin_unlock_irqrestore(&my_lock, flags);
? 特點:
  • 獲取不到鎖會 原地忙等(自旋),適合快速操作;
  • 不可用于睡眠上下文,否則死鎖;
  • 常用于中斷處理函數、底半部等高優先級邏輯。
? 面試考點:
  • spin_lock 與 mutex 有什么區別?
  • 中斷上下文是否可以使用 mutex?→ 否。

3.3 信號量(Semaphore)

? 場景:控制多個線程對有限資源訪問
struct semaphore sem;
sema_init(&sem, 3);  // 最多允許3個并發/* 請求資源 */
down(&sem);  // 若資源不足,將睡眠/* 使用資源 *//* 釋放資源 */
up(&sem);
  • 適合表示資源池,如“3臺打印機”、“10個緩存槽位”;
  • 已逐漸被 mutex 替代。
? 面試考點:
  • down()/up() 會阻塞線程嗎?→ 是。
  • 信號量適合中斷中使用嗎?→ 否(會睡眠)。

3.4 互斥鎖(Mutex)

? 場景:線程間對共享數據的互斥訪問
struct mutex my_mutex;
mutex_init(&my_mutex);mutex_lock(&my_mutex);
/* 臨界區代碼 */
mutex_unlock(&my_mutex);
  • 獲取不到鎖會讓當前線程 掛起等待,資源釋放后再調度回來;
  • 不適合中斷處理。
? 特點對比:
比較項spinlockmutex
可否睡眠
場景中斷/底半部普通線程
獲取失敗自旋等待睡眠等待
? 面試考點:
  • mutex 和 semaphore 區別?→ semaphore 是計數,mutex 僅一人。

3.5 RCU(Read-Copy-Update)

? 場景:讀多寫少,如任務列表、網絡表項
讀操作(不加鎖):
rcu_read_lock();
my_ptr = rcu_dereference(global_ptr);
/* 安全讀取數據 */
rcu_read_unlock();
寫操作(復制更新):
new_ptr = kmalloc(...);
/* 修改副本 */
rcu_assign_pointer(global_ptr, new_ptr);
synchronize_rcu();
/* 釋放舊數據 */
kfree(old_ptr);
? 特點:
  • 讀性能極高,不加鎖;
  • 寫復雜,需注意數據生命周期;
  • 常用于鏈表、哈希表等結構。
? 面試考點:
  • RCU 是否支持多讀多寫?→ 多讀 + 單寫 + 延遲銷毀。
  • RCU 與普通鎖最大區別?→ 讀時不阻塞。

四、實戰示例:共享計數器保護

? 錯誤示例:未加鎖

static int count = 0;void do_work(void) {count++;  // 多線程訪問存在競態!
}

? 正確方式:使用原子變量

static atomic_t count = ATOMIC_INIT(0);void do_work(void) {atomic_inc(&count);
}

? 或使用自旋鎖

static int count = 0;
static spinlock_t lock;void do_work(void) {spin_lock(&lock);count++;spin_unlock(&lock);
}

? 或使用 mutex(若可睡眠)

static int count = 0;
static struct mutex my_mutex;void do_work(void) {mutex_lock(&my_mutex);count++;mutex_unlock(&my_mutex);
}

五、面試常見問題匯總(含答案)

  1. spinlock 和 mutex 有何區別?

    • spinlock 不可睡眠、適用于中斷上下文;mutex 會睡眠、適合線程間同步。
  2. 原子變量需要加鎖嗎?

    • 不需要,已具備原子性。
  3. 哪些鎖不能用于中斷?

    • mutex、semaphore 會睡眠,不能用于中斷處理。
  4. RCU 為什么性能高?

    • 讀操作無鎖,不阻塞任何線程,極高并發性。
  5. 如何避免死鎖?

    • 保持鎖獲取順序一致;禁止在持鎖時調用睡眠函數(如 mutex + msleep());中斷上下文避免調用可睡眠接口。

六、小結:如何選用同步機制?

場景建議同步方式
標志位、計數器原子變量
中斷處理、底半部自旋鎖
用戶進程臨界區互斥鎖 mutex
限制訪問數量(N個資源)信號量 semaphore
讀多寫少表結構RCU

七、結束語

Linux 內核的同步機制是驅動開發和內核編程中的“必修課”,掌握好它不僅能寫出正確的代碼,更是邁入高級內核開發的關鍵一步。

📚 🔥 推薦:《Yocto項目實戰教程:高效定制嵌入式Linux系統》
京東正版促銷,歡迎支持原創!
鏈接:https://item.jd.com/15020438.html


🎥 視頻教程請關注 B 站:“嵌入式 Jerry”

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/news/910042.shtml
繁體地址,請注明出處:http://hk.pswp.cn/news/910042.shtml
英文地址,請注明出處:http://en.pswp.cn/news/910042.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

效果成本雙突破!快手提出端到端生成式推薦系統OneRec!

近日,快手推薦模型團隊提出了一個端到端生成式推薦系統OneRec,該系統采用Encoder-Decoder架構,引入了基于獎勵機制的偏好對齊方法,借助強化學習增強模型效果,可在獎勵模型引導下直接生成契合用戶偏好的視頻內容。通過極…

flex布局 項目屬性

<!DOCTYPE html> <html> <head> <meta charset"utf-8"> <title>flex布局 項目屬性</title> <link href"css/k.css" rel"stylesheet" /> </head> <bod…

SpringBoot擴展——應用Web Service!

應用Web Service Web Service是一個SOA&#xff08;面向服務的編程&#xff09;架構&#xff0c;這種架構不依賴于語言&#xff0c;不依賴于平臺&#xff0c;可以在不同的語言之間相互調用&#xff0c;通過Internet實現基于HTTP的網絡應用間的交互調用。Web Service是一個可以…

EasyExcel學習筆記

EasyExcel學習 一、EasyExcel簡介 一、EasyExcel是什么 EasyExcel是一個基于Java的簡單、省內存的讀寫Excel的阿里開源項目。在盡可能節約內存的情況下支持讀寫百M的Excel。 官網&#xff1a;https://easyexcel.opensource.alibaba.com/ 學習Easyexcel前需要了解導入和導出…

day4課程

1整體認識和路由配置 2二級分類面包屑導航實現 3基礎商品列表渲染 4列表篩選功能實現 5列表無限加載功能實現 6定制路由滾動行為 7詳情頁整體認識和路由配置 8詳情頁基礎數據渲染 9詳情頁基礎組件封裝和數據渲染 10適配不同title和數據列表 11小圖切換大圖 12滑塊跟隨鼠標移動 …

kubeadm worker節點加入master失敗

文章目錄 1、操作2、問題現象3、問題原因4、問題解決4.1、重新生成token4.2、重新生成hash值 5、驗證 1、操作 執行以下命令&#xff0c;讓worker節點加入到master節點 kubeadm join 103.123.222.241:6443 --token vxe3v1.wzpnks8v1vbbtsu0 --discovery-token-ca-cert-hash s…

二十二、【用戶管理與權限 - 篇四】后端權限定義:模型與 API 實現

【用戶管理與權限 - 篇四】后端權限定義:模型與 API 實現 前言準備工作第一部分:設計并創建 `Permission` 模型第二部分:更新 `Role` 模型以關聯 `Permission`第三部分:生成并應用數據庫遷移第四部分:創建 Serializers第五部分:創建 ViewSets第六部分:注冊 API 路由第七…

猜數字小游戲微信流量主小程序開源

這個智力小游戲采用了數字華容道的玩法&#xff0c;玩家需要通過移動數字方塊&#xff0c;將數字按順序排列完成游戲。代碼嚴格遵循微信小程序的目錄結構&#xff0c;包含以下部分&#xff1a; 完整的小程序配置文件&#xff08;app.js、app.json、app.wxss&#xff09; 游戲頁…

探秘阿里云EBS存儲:云計算的存儲基石

一、引言 在云計算時代&#xff0c;數據如同企業的生命線&#xff0c;數據存儲的重要性不言而喻。隨著企業數字化轉型的加速&#xff0c;海量數據的存儲與高效管理成為亟待解決的問題。云存儲以其卓越的靈活性、可擴展性和成本效益&#xff0c;逐漸成為眾多企業的首選方案。在…

音視頻之H.264的可伸縮編碼SVC

系列文章&#xff1a; 1、音視頻之視頻壓縮技術及數字視頻綜述 2、音視頻之視頻壓縮編碼的基本原理 3、音視頻之H.264/AVC編碼器原理 4、音視頻之H.264的句法和語義 5、音視頻之H.264/AVC解碼器的原理和實現 6、音視頻之H.264視頻編碼傳輸及其在移動通信中的應用 7、音視…

Anaconda安裝env,yml一直卡在Solving environment:不動

如果在使用conda env creat -f env.yml時候&#xff0c;anaconda一直卡住&#xff0c;如下 可以嘗試下面操作。 conda config --set solver libmamba # 使用libmamba引擎&#xff08;Conda≥22.11&#xff09; conda env create -f env.yaml # 重新嘗試

榕壹云婚戀相親系統:ThinkPHP+UniApp打造高效婚配平臺

引言 在數字化浪潮下,婚戀相親行業正加速向線上遷移。榕壹云公司基于市場需求與技術積累,開發一款功能完備、技術開源的婚戀相親小程序系統,為單身人士提供高效、安全的婚戀平臺。本文將圍繞系統背景、客戶定位、核心技術、功能模塊及優勢場景展開詳細解析,助力開發者與技…

查詢docker-compose 部署的milvus 請求日志

在 Docker Compose 部署的 Milvus 中,日志默認存儲在各個服務的容器內。以下是定位和查詢日志的方法: 1. 查看實時日志 使用 docker-compose logs 命令查看實時日志: bash # 查看所有服務的日志 docker-compose logs -f# 僅查看 Milvus 服務日志(服務名以 docker-compos…

Rsync實操

Rsync實操 一.rsync命令 #類似于cp[rootuser2 ~]# rsync info.sh root192.168.168.130:/rootroot192.168.168.130s password: [rootuser1 ~]# lsanaconda-ks.cfg ceph-release-1-1.el7.noarch.rpm info.sh 二、使用rsync備份push方式 服務器&#xff1a;server 192.168.168…

Java常見八股-(6.算法+實施篇)

Java常見八股-&#xff08;1.Java基礎篇&#xff09; Java常見八股-&#xff08;2.Java高級篇&#xff09; Java常見八股-&#xff08;3.MySQL篇&#xff09; Java常見八股-&#xff08;4.前端篇&#xff09; Java常見八股-&#xff08;5.框架篇&#xff09; 目錄 一、算…

阿里云部署的SMTP服務器安全攻防實錄:深度解析攻擊、防護與加固

阿里云部署的SMTP服務器安全攻防實錄&#xff1a;深度解析攻擊、防護與加固 一次針對云上SMTP服務的持續攻擊事件&#xff0c;揭示了郵件中繼服務面臨的多重安全挑戰。本文將深入剖析攻擊手法、防護策略與系統性加固方案。 某企業在阿里云上部署的Postfix SMTP服務器近期遭遇…

HTTP與HTTPS深度解析:從明文傳輸到安全通信的演進之路

引言 在互聯網的早期&#xff0c;HTTP&#xff08;超文本傳輸協議&#xff09;作為Web通信的基石&#xff0c;憑借簡單高效的特性推動了萬維網的爆發式增長。但隨著互聯網從“信息共享”向“價值交互”演進&#xff0c;HTTP的明文傳輸特性逐漸暴露致命缺陷——用戶的每一次點擊…

滲透實戰:繞過沙箱機制的反射型XSS

Lab 24&#xff1a;利用 xss 繞過 csrf 防御 依然是留言板的問題可以執行<h1>標簽 進入修改郵箱的界面&#xff0c;修改抓包 這里構造修改郵箱的代碼 <script> var req new XMLHttpRequest(); req.onload handleResponse; req.open(get,/my-account,true); req…

K8S篇之利用deployment實現滾動平滑升級

一、更新策略 在 Kubernetes (K8s) 中,滾動平滑升級(Rolling Update)是一種無縫更新部署的方式,允許你在不中斷服務的情況下逐步更新應用程序。這是 Kubernetes 默認的 Deployment 更新策略,它會按照指定的步幅逐步替換 Pods,確保在新版本的應用程序沒有完全替換舊版本的…

【Dify 案例】【MCP實戰】【一】【前置配置】

MCP(Model Context Protocol,模型上下文協議) ,2024年11月底,由Anthropic 推出的一種開放標準。旨在為大語言模型(LLM)提供統一的、標準化方式與外部數據源和工具之間進行通信。 MCP 作為一種標準化協議,極大地簡化了大語言模型與外部世界的交互方式,使開發者能夠以統…