自旋鎖

自旋鎖概念

自旋鎖應該是Linux內核中使用最多的鎖了,其它鎖很多都依賴自旋鎖實現。自旋鎖概念上簡單,一個自旋鎖是一個互斥設備,只能有2個值:“上鎖"和"解鎖”。它常常實現爲一個整數值中的一個單個位,想獲取一個特殊鎖的代碼測試相關的位,如果鎖是可用的,這個"上鎖"位被置位並且代碼繼續進入臨界區;相反,如果這個鎖已經被別人獲得,代碼進入一個緊湊的循環中反覆檢查這個鎖,直到它變爲可用。這個循環就是自旋鎖的"自旋"部分。

選擇自旋鎖,自旋等待的代價應該要儘可能的小於線程調度的代價。即,使用自旋鎖的一個重要規則是自旋鎖必須一直是儘可能短時間的持有。這個很好理解,因爲你持有的時間越長,其他線程就不得不長時間自旋等待。同時持有線程不應被搶佔或睡眠,如果真發生了,其他等待線程就悲劇了。

自旋鎖API

相關API,頭文件#include<linux/spinlock.h>

void spin_lock_init(spinlock_t *lock);  //初始化
void spin_lock(spinlock_t *lock);       //加鎖
void spin_unlock(spinlock_t *lock);     //釋放鎖

...... 其他函數這裏不再列出
  • spin_lock_init——對應的邏輯可以理解爲對標識位初始化;
  • spin_lock——對應的邏輯可以理解爲,先嚐試加鎖(對標識位進行操作),如果成功則可持有臨界資源,如果嘗試加鎖失敗,就進入do-while循環繼續嘗試加鎖(即,自旋),直到加鎖成功;
  • spin_unlock——對應的邏輯是將標識位置爲未加鎖狀態;

Linux版本不同,對應的實現可能是不同的,Linux-2.6.25版本後實現了先到先得功能,所以實現的代碼與之前版本是不同的,大致思路是相同的,只是標識位及判斷狀態的方法不同。


參考文檔:
帶您進入內核開發的大門 | 自旋鎖的使用
自旋鎖

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