一、概述
近期深入的學習了 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章節)中文翻譯(下)
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/255668.html
標籤:其他
上一篇:JVM和位元組碼的關系
