linux內核併發基本概念


在討論linux內核併發之前,我們先來分享一個情景。

字符數組array是一個內核全局數組,執行函數ArrayWrite_A的線程稱爲線程A,執行函數ArrayWrite_B的線程稱爲線程B。線程A和線程B均可訪問全局數組array,ArrayWrite_A函數實現的功能是將數組成員依次從0遞增賦值到9,ArrayWrite_B函數實現的功能是將數組成員全部賦值爲1。



假設此時線程A運行到函數ArrayWrite_A,我們期望的結果是函數ArrayWrite_A執行完後,數組array中的成員應該依次存放着0到9。如圖1所示。

我們來模擬一下併發的場景。假設此時線程A運行到函數ArrayWrite_A,當函數ArrayWrite_A執行到indexA = 3時,數組成員被賦值的情況如圖2所示。然而這時,線程A被操作系統調度程序切換出去,而調度執行了線程B,此時線程B開始執行函數ArrayWrite_B,假設函數ArrayWrite_B執行完畢,此時線程B被操作系統調度程序切換出去,那麼數組成員被賦值的情況如圖3所示。此時線程A得到重新調度執行,等到線程A執行完函數ArrayWrite_A時,數組成員的賦值情況如圖4所示。此時,我們看到,全局數組array中的成員賦值情況,即不是線程A所期望的,也不是線程B所期望的。這樣一個過程就稱爲競態

通過這個場景,只是希望來幫助大家來理解linux內核併發相關的概念。全局數組array稱爲共享資源,共享資源能夠被多個線程或進程訪問,共享資源可以使軟件資源,如全局變量、共享內存等,也可以是硬件資源,硬件資源的共享也很容易理解,例如你一邊用視頻播放器看着電影,一邊用音頻播放器聽這音樂,那麼你的聲卡資源就被兩個進程共享了。臨界區呢?臨界區就是訪問共享資源的代碼片段,這裏需要理解的是臨界區指的是代碼,這段代碼能夠訪問共享資源,在函數ArrayWrite_A和函數ArrayWrite_B中,for循環中的代碼就是臨界區。

 

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