Linux中的並發和競態

來源:互聯網
上載者:User
本帖大體上描述Linux kernel為解決並發導致的競態所提供的核心API(主要是訊號量和自旋鎖)之間的區別,側重於使用方面。代碼級的閱讀比較打算另開一貼。
因為程式的並發執行而導致的競態是Linux核心中一個非常複雜的方面。對於裝置的驅動程式開發人員而言,熟悉Linux核心提供的並發互斥的處理機制相當重要。所謂競態,簡而言之,是多個核心線程有可能對同一資源進行操作時可能導致的核心資料紊亂的行為。共用資料是並發的根本原因。
並發的來源—
我把並發來源分為兩個大的方面來分別進行討論:單一處理器和多處理器。
1.單一處理器
對於單一處理器而言,並發主要來自於中斷,可搶佔的核心和各種延遲隊列。
2.多處理器
多處理器的情況更加複雜,在同一時間,同一代碼可同時在不同處理器上執行。對這種並發的處理要更加棘手。
核心的互斥設施—
驅動程式開發人員對核心提供的互斥機制的確切理解是寫出高安全性代碼的關鍵。在Linux核心中,這種設施主要是訊號量和自旋鎖。
1.訊號量
訊號量的原理主要是基於對一記憶體單元的原子性的測試和設定作業(atomic test and set),不同處理器有不同的組合語言用於提供這種機制。因為記憶體單元對於多處理器系統中的每個處理器都是共用的,所以這種機制同樣適用於多處理器。
相對於自選鎖,訊號量的最大特點是允許調用它的線程進入睡眠狀態。這意味著試圖獲得某一訊號量的線程會導致對處理器擁有權的喪失,也即出現進程的切換。
2.自旋鎖
自旋鎖的出現最初是為瞭解決多處理器上出現的互斥問題。其原理是,試圖獲得鎖的線程去進行原子性的位測試和設定作業(atomic bit test and set),如果沒有別的處理器進入臨界區,那麼當前線程將獲得鎖,鎖定之後進入臨界區。如果有別的處理器在臨界區中,那麼當前處理器將進入忙等待狀態,直到其他處理器解開該鎖。與訊號量最大的區別是,試圖進入臨界區的線程如果得不到鎖,那麼就一直不停地執行atomic bit test操作而不會進入睡眠狀態。這種情況下,試圖獲得鎖的處理器上將啥工作也幹不了(除了進行這種atomic
bit test操作外),正因為如此,所以要求獲得鎖的線程要以最短的時間結束臨界區中的操作。
在單一處理器上,自旋鎖更確切的意義是,一個試圖獲得鎖的線程實際上是向系統通告:當我執行下面代碼時,不要將我切換出處理器。因此,單一處理器上的自旋鎖代碼實際是在完成對處理器的強制擁有的操作。而在單一處理器上,中斷和搶佔是最大可能的並發源頭,所以,實際上單一處理器上的自旋鎖的實現代碼簡單歸結為:關中斷和關閉搶佔。理解spin lock的實現代碼需要深刻的處理器相關知識和組合語言。
基於以上的實現原理,使用自旋鎖的一個核心規則是:擁有鎖的線程絕對不可以放棄處理器。因為假設它放棄了處理器,那麼另一個獲得處理器線程的代碼如果想獲得該鎖,將不得不等待很長的時間,更壞的情況下導致系統的死結。更具體的描述:在單一處理器上,一個獲得鎖的線程必然運行在中斷和搶佔都關閉的環境中,這種情況下被動的放棄處理器已經成為不可能,只有主動放棄處理器才會出現,比如在互斥代碼中調用了copy_from_user,該函數的實現中使進程進入休眠成為可能,如果恰巧下一個被調度啟動並執行線程試圖獲得該鎖,那麼系統將進入死結狀態,因為這種情況下後來被調度的線程已經沒有主動放棄處理器的可能(因為它此時正運行試圖獲得鎖的代碼,不可能調用到那些有可能主動放棄處理器的函數)。具體的例子:
假設系統中有A和B兩個線程,當A線程執行到下面的代碼時將可能會丟失處理器:
spinlock_t   g_lock = SPIN_LOCK_UNLOCKED;  //一個全域的spin_lock 變數
A代碼:
spin_lock_init(&g_lock);
spin_lock (&g_lock);
copy_from_user(…);  //A線程在該函數中失去處理器的擁有權
被調度執行的B線程代碼:

spin_lock (&g_lock); //因為已經休眠的A線程沒有釋放g_lock,所以B線程將永遠在此處自旋下去。注意此時中斷和搶佔都是關閉的,即被動放棄處理器已經不可能。
互斥問題的複雜性恰恰就在這裡:休眠可發生在許多無法預期的地方。因此當我們編寫需要在自旋鎖下執行的代碼時,必須注意每一個所調用的函數
相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.