標籤:style blog http ar color sp for on 2014
在討論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迴圈中的代碼就是臨界區。
linux核心並發基本概念