互斥鎖
如果一個資源會被不同的線程訪問修改,那么我們把這個資源叫做臨界資源
(《操作系統》),那么對於該資源訪問修改相關的代碼就叫做臨界區
。引入互斥鎖即解決多個線程
之間共享同一個共享資源
,這是多線程編程需要考慮的一個問題。
互斥鎖又稱互斥型信號量,是一種特殊的二值性信號量,用於實現對共享資源的獨占式處理。
任意時刻互斥鎖的狀態只有兩種:開鎖或閉鎖
。當有任務持有時,互斥鎖處於閉鎖狀態,這個任務獲得該互斥鎖的所有權。當該任務釋放它時,該互斥鎖被開鎖,任務失去該互斥鎖的所有權。當一個任務持有互斥鎖時,其他任務將不能再對該互斥鎖進行開鎖或持有。
自旋鎖(Spin_lock)
工作原理
:Spin_lock是Linux內核的一種同步機制。內核代碼可以通過獲得spin_lock宣稱對某一資源的占有,直到其釋放該spin_lock;如果內核代碼試圖獲得一個已經鎖定的spin_lock,則這部分代碼會一直忙等待,直到獲得該spin_lock。
spinlock會輪詢占用cpu 那為什么還要它呢?
原因
:spin_lock 用在多處理器驅動程序中,多個處理器可能同時進入到一段代碼中。在單處理機器上,自旋鎖是無意義的。因為在編譯時不會加入自旋鎖,僅僅被當作一個設置內核搶占機制是否被啟用的開關。如果禁止內核搶占,那么在編譯時自旋鎖會被完全剔除出內核。
Spin_lock的kernel中的實現對單核(UP),多核(SMP)有不同的處理方式。對單核來說,如果spin_lock不處於中斷上下文,則spin_lock鎖定的代碼丟失CPU擁有權,只會在內核搶占的時候發生。所以,對於單核來說,只需要在spin_lock獲得鎖的時候禁止搶占,釋放鎖的時候開放搶占。對多核來說,存在兩段代碼同時在多核上執行的情況,這時候才需要一個真正的鎖來宣告代碼對資源的占有。