自旋鎖spinlock剖析
阿新 • • 發佈:2019-01-07
1, spinlock介紹
spinlock又稱自旋鎖,執行緒通過busy-wait-loop的方式來獲取鎖,任時刻只有一個執行緒能夠獲得鎖,其他執行緒忙等待直到獲得鎖。spinlock在多處理器多執行緒環境的場景中有很廣泛的使用,一般要求使用spinlock的臨界區儘量簡短,這樣獲取的鎖可以儘快釋放,以滿足其他忙等的執行緒。Spinlock和mutex不同,spinlock不會導致執行緒的狀態切換(使用者態->核心態),但是spinlock使用不當(如臨界區執行時間過長)會導致cpu busy飆高。
2, spinlock與mutex對比
2.1,優缺點比較
spinlock不會使執行緒狀態發生切換,mutex在獲取不到鎖的時候會選擇sleep。
mutex獲取鎖分為兩階段,第一階段在使用者態採用spinlock鎖匯流排的方式獲取一次鎖,如果成功立即返回;否則進入第二階段,呼叫系統的futex鎖去sleep,當鎖可用後被喚醒,繼續競爭鎖。
Spinlock優點:沒有昂貴的系統呼叫,一直處於使用者態,執行速度快。
Spinlock缺點:一直佔用cpu,而且在執行過程中還會鎖bus匯流排,鎖匯流排時其他處理器不能使用匯流排。
Mutex優點:不會忙等,得不到鎖會sleep。
Mutex缺點:sleep時會陷入到核心態,需要昂貴的系統呼叫。
2.2,使用準則
Spinlock使用準則:臨界區儘量簡短,控制在100行程式碼以內,不要有顯式或者隱式的系統呼叫,呼叫的函式也儘量簡短。例如,不要在臨界區中呼叫read,write,open等會產生系統呼叫的函式,也不要去sleep;strcpy,memcpy等函式慎用,依賴於資料的大小。