linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)
本章導讀
Linux設備驅動中必須解決的一個問題是多個進程對共享資源的并發訪問,并發的訪問會導致競態(競爭狀態)。
Linux提供了多種解決競態問題的方式,這些方式適合不同的應用場景。
7.1講解了并發和競態的概念及發生場合。
7.2講解了編譯亂序、執行亂序的問題,以及內存屏障。
7.3~7.8分別講解了中斷屏蔽、原子操作、自旋鎖、信號量和互斥體等并發控制機制。
7.1 并發與競態
并發是多個執行單元同時、并行被執行,而并發的執行單元對共享資源(硬件資源和軟件上的全局變量、靜態變量等)的訪問,則很容易導致競態。例如,對于globalmem設備,假設一個執行單元A對其寫入3000個字符“a”,而另一個執行單元B對其寫入4000個“b”,第三個執行單元C讀取globalmem的所有字符。如果執行單元A、B的寫操作按圖7.1順序發生,執行單元C的讀操作不會有什么問題。
但是,如果執行單元A、B按圖7.2被執行,而執行單元C又“不合時宜”(在不合適的時間作不合適的事情)地讀,則會讀出3000個字符“b”。
比圖7.2更復雜、更混亂的并發大量存在于設備驅動中,只要并發的多個執行單元存在對共享資源的訪問,競態就可能發生。在Linux內核中,主要的競態發生在以下幾種情況。
1.對稱多處理器(SMP)的多個CPU
SMP是一種緊耦合、共享存儲的系統模型,體系結構如圖7.3所示,特點是多個CPU使用共同的系統總線,因此可訪問共同的外設和存儲器。
在SMP的情況下,兩個核(CPU0和CPU1)的競態可能發生于CPU0的進程與CPU1的進程之間、CPU0的進程與CPU1的中斷之間以及CPU0的中斷與CPU1的中斷之間,圖7.4中任何一條線連接的兩個實體都有核之間并發可能性。
2.單CPU內進程與搶占它的進程
Linux 2.6以后的內核支持內核搶占調度,一個進程在內核執行時可能耗完了自己的時間片,也可能被另一個高優先級進程打斷,進程與搶占該進程的進程訪問共享資源的情況類似于SMP的多個CPU。
3.中斷(硬中斷、軟中斷、Tasklet、底半部)與進程之間
中斷可以打斷正在執行的進程,如果中斷服務程序(ISR)訪問進程正在訪問的資源,則也會產生競態。
中斷也有可能被新的更高優先級的中斷打斷,因此,多個中斷之間本身也可能引起并發而導致競態。Linux 2.6.35之后,就取消了中斷的嵌套。老版本的內核可以在申請中斷時,設置標記IRQF_DISABLED以避免中斷嵌套,由于新內核直接就默認不嵌套中斷,這個標記反而變得無用了。
上述并發的發生除了SMP是真正的并行以外,其他的都是單核上的“宏觀并行,微觀串行”,其引發的實質問題和SMP相似。圖7.5再現了SMP情況下總的競爭狀態可能性,既包含某一個核內的(CPU內部),也包括兩個核之間(CPU之間)的競態。
解決競態問題的途徑是保證對共享資源的互斥訪問,互斥訪問是指一個執行單元(進程)在訪問共享資源時,其他的執行單元(進程)被禁止訪問。
訪問共享資源的代碼區域稱為臨界區(Critical Sections),臨界區需要被以某種互斥機制加以保護。
中斷屏蔽、原子操作、自旋鎖、信號量、互斥鎖、完成量等
是Linux設備驅動中可以采用的互斥途徑。
總結
以上是生活随笔為你收集整理的linux 两个驱动 竞态,第7章 Linux设备驱动中的并发控制之一(并发与竞态)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 基因组组装程序linux,基因组组装软件
- 下一篇: linux勒索病毒名称,Linux 也有