bkl(大核心鎖)是乙個全域性自旋鎖,使用它主要是為了方便實現從linux最初的smp過度到細粒度加鎖機制。
bkl的特性:
持有bkl的任務仍然可以睡眠 。因為當任務無法排程時,所加的鎖會自動被拋棄;當任務被排程時,鎖又會被重新獲得。當然,並不是說,當任務持有bkl時,睡眠是安全的,緊急是可以這樣做,因為睡眠不會造成任務死鎖。
bkl是一種遞迴鎖。乙個程序可以多次請求乙個鎖,並不會像自旋鎖那麼產生死鎖。
bkl可以在程序上下文中。
bkl是有害的。
在核心中不鼓勵使用bkl。乙個執行執行緒可以遞迴的請求鎖lock_kernel(),但是釋放鎖時也必須呼叫同樣次數的unlock_kernel()操作,在最後乙個解鎖操作完成之後,鎖才會被釋放。
在kernel_lock.c(lib)中
/* * these are the bkl spinlocks - we try to be polite about preemption.
* if smp is not on (ie up preemption), this all goes away because the
* _raw_spin_trylock() will always succeed.
*/ #ifdef config_preempt
static inline void __lock_kernel(void)
/* * otherwise, let's wait for the kernel lock
* with preemption enabled..
*/ do while (!_raw_spin_trylock(&kernel_flag));
} }
#else
/* * non-preemption case - just get the spinlock
*/ static inline void __lock_kernel(void)
#endif
static inline void __unlock_kernel(void)
void __lockfunc unlock_kernel(void)
bkl在被持有時同樣會禁止核心搶占。多數情況下,bkl更像是保護**而不是保護資料。
BKL(大核心鎖)
bkl 大核心鎖 是乙個全域性自旋鎖,使用它主要是為了方便實現從linux最初的smp過度到細粒度加鎖機制。bkl的特性 持有bkl的任務仍然可以睡眠 因為當任務無法排程時,所加的鎖會自動被拋棄 當任務被排程時,鎖又會被重新獲得。當然,並不是說,當任務持有bkl時,睡眠是安全的,緊急是可以這樣做,因...
核心 自旋鎖
自旋鎖用於多處理器環境下保護資料。如果核心發現資料未鎖,就獲取鎖並執行 如果資料被鎖,就一直旋轉 反覆執行一條指令 自旋鎖在單處理器環境下 非搶占式核心 下,不起作用 單處理器搶占式核心的情況下,自旋鎖起到禁止搶占的作用。注釋 核心搶占 可搶占式核心 即當程序位於核心空間時,有乙個更高優先順序的任務...
Linux 核心自旋鎖
現在很多cpu都是幾核幾核的了,如果有乙個變數a,cpu x正在訪問,突然cpu y也過來訪問他,這時候就可能出現問題,因為這個a非常重要,可能導致系統崩潰,中斷異常等。我們來看之前說的tp驅動裡面的 void gtp irq enable struct goodix ts data ts spin...