自旋鎖

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等函數慎用,依賴於數據的大小。


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