天天看點

linux驅動開發--字元裝置:自旋鎖

自旋鎖的使用

自旋鎖(spin lock)是一種對臨界資源進行互斥通路的典型手段,其名稱來源于它的工作方式。為了獲得自旋鎖,在某cpu上運作的代碼需要先執行一個院子操作,該操作測試并設定某個記憶體變量,由于它是原子操作,是以在該操作完成之前其他執行單元不可能通路這個記憶體變量。

如果測試結果表明鎖已經空閑,則程式獲得這個自旋鎖并繼續執行;如果測試結果表明鎖被占用,程式将在一個小循環内重複這個“測試并設定”操作,即金星所謂的“自旋”。當自旋鎖的持有者通過重置該變量釋放這個自旋鎖後,某個等待的“測試并設定”操作向其調用者報告鎖已釋放。

linux系統中與自旋鎖相關的操作如下:

1、定義自旋鎖 spinlock_t spin;

2、初始化自旋鎖 spin_lock_init(lock);

3、獲得自旋鎖 spin_lock(lock);該宏用于獲得自旋鎖lock,如果能夠立即獲得鎖,它就馬上傳回,否則,它将自旋在哪裡,直到該自旋鎖的保持者釋放。spin_trylock(lock);該宏嘗試獲得自旋鎖lock,如果能立即獲得鎖,它獲得鎖并傳回真,否則立即傳回假,實際上不再“在原地打轉”。

4、釋放鎖spin_unlock(lock);該宏釋放自旋鎖lock,它與spin_trylock或spin_lock配對使用。

自旋鎖的一般使用方式:

自旋鎖主要針對smp或單cpu但核心可搶占的情況,對于單cpu和核心不支援搶占的系統,自旋鎖退化為空操作。在單cpu和核心可搶占的系統中,自選鎖持有期間核心的搶占将被禁止。由于核心搶占的單cpu系統的行為實際很類似于smp系統,是以在這樣的單cpu系統中使用自旋鎖扔十分必要。

在使用自旋鎖中還要特别注意如下問題:

自旋鎖實際上是忙等鎖,當鎖不可用時,cpu一直循環執行“測試并設定”該鎖直到可用而取得該鎖,cpu在等待自旋鎖時不做任何有用的工作,僅僅是等待。是以隻有在占用鎖的事件極短的情況下,使用自旋鎖才是合理的。當臨界區很大或有共享裝置的時候,需要較長事件占用鎖,使用自旋鎖會降低系統的性能。

自旋鎖可能導緻系統死鎖。引發這個問題最常見的情況是遞歸使用一個自旋鎖,即如果一個已經擁有某個自旋鎖的cpu想第二次獲得這個自旋鎖,則該cpu将死鎖。此外,如果程序獲得自旋鎖後再阻塞,也可能導緻死鎖的發生。copy_from_user()/copy_to_user()和kmalloc()等函數都有可能引起阻塞,是以自旋鎖的占用期間不能調用這些函數。

繼續閱讀