Linux內核同步機制之基本概念

一、概述

近期深入的學習了 Linux 內核同步機制,將相關內容整理於此,既是一次梳理,也是一個分享,希望能幫助到讀者一二。當然,所謂的深入也只是筆者現有的技術能力所能達到的程度而已。由於能力有限,有錯誤之處還請各位讀者不吝指教,一起學習一起進步。

常用的 Linux 內核同步機制有原子操作、per-cpu 變量、內存屏障、自旋鎖、Mutex 鎖、信號量和 RCU 等,後面幾種鎖實現會依賴於前三種基礎同步機制。但是,在正式開始介紹具體的內核同步機制實現之前,需要先澄清一些基本概念。

二、基本概念

2.1 同步

既然是同步機制,那就首先要搞明白什麼是同步。同步是指用於實現控制多個執行路徑按照一定的規則或順序訪問某些系統資源的機制。所謂執行路徑,就是在 CPU 上運行的代碼流。我們知道,CPU 調度的最小單位是線程,可以是用戶態線程,也可以是內核線程,甚至是中斷服務程序。所以,執行路徑在這裏就包括用戶態線程、內核線程和中斷服務程序。執行路徑、執行單元、控制路徑等等,叫法不同,但本質都一樣。那爲什麼需要同步機制呢?請繼續往下看。

2.2 併發與競態

併發是指兩個以上的執行路徑同時被執行,而併發的執行路徑對共享資源(硬件資源和軟件上的全局變量、靜態變量等)的訪問則很容易導致競態。例如,現在系統有一個 LED 燈可以由 APP 控制,APP1 控制燈亮一秒滅一秒,APP2 控制燈亮 500ms 滅 1500ms。如果 APP1 和 APP2 分別在 CPU1 和 CPU2 上併發運行,LED 燈的行爲會是什麼樣的呢?很有可能 LED 燈的亮滅節奏都不會如這兩個 APP 所願,APP1 在關掉 LED 燈時,很有可能恰逢 APP2 正要打開 LED 燈。很明顯,APP1 和 APP2 對 LED 燈這個資源產生了競爭關係。競態是危險的,如果不加以約束,輕則只是程序運行結果不符合預期,重則系統崩潰。在操作系統中,更復雜、更混亂的併發大量存在,而同步機制正是爲了解決併發和競態問題。同步機制通過保護臨界區(訪問共享資源的代碼區域)達到對共享資源互斥訪問的目的,所謂互斥訪問,是指一個執行路徑在訪問共享資源時,另一個執行路徑被禁止去訪問。更多內容請查閱宋寶華老師的《Linux 設備驅動開發詳解》一書中第七章第一節,書中詳細列舉了競態發生的場景,總結如下圖。

2.3 編譯亂序與編譯屏障

參閱筆者轉載的這篇文章 https://blog.csdn.net/weixin_43555423/article/details/113481578

2.4 執行亂序與內存屏障

《Linux 設備驅動開發詳解》一書中第七章第二節對編譯亂序和執行亂序都有簡略的介紹,通俗易懂,不可不讀。不管是編譯亂序還是執行亂序,都是爲了提升 CPU 的性能。而要真正的理解透執行亂序,首先需要搞清楚 cache 的概念。強烈建議關注奔跑 Linux 社區這個公衆號,裏面有三篇關於 cache 的文章,分爲上中下,作者笨叔講解的非常透徹。內存屏障是爲了解決執行亂序引入的問題,是同步機制裏最難理解的一塊。關於內存屏障,後面會開專題來介紹。

http://www.wowotech.net/kernel_synchronization/Why-Memory-Barriers.html  Why Memory Barriers?中文翻譯(上)

http://www.wowotech.net/kernel_synchronization/why-memory-barrier-2.html  Why Memory Barriers?中文翻譯(下)

http://www.wowotech.net/kernel_synchronization/memory-barrier-1.html  perfbook memory barrier(14.2章節)的中文翻譯(上)

http://www.wowotech.net/kernel_synchronization/perfbook-memory-barrier-2.html  perfbook memory barrier(14.2章節)中文翻譯(下)

 

 

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章