Spinlock
這是一個內核態概念。 spin lock與semaphore的主要區別是等待方式,spin lock是busy waiting,而semaphore是sleep。對於可以sleep的進程來說,busy waiting當然沒有意義。對於單CPU的系統,busy waiting當然更沒意義(沒有CPU可以釋放鎖)。因此,只有多CPU的內核態非進程空間,才會用到spin lock。 Linux kernel的spin lock在非SMP的情況下,只是關irq,沒有別的操作,用於確保該段程序的運行不會被打斷。其實也就是類似mutex的作用,串行化對critical section的訪問。但是mutex不能保護中斷的打斷,也不能在中斷處理程序中被調用。而spin lock也一般沒有必要用於可以sleep的進程空間。
spinlock函式定義在<linux/spinlock.h>
先定義結構
spinlock_k *lock
上鎖
void spin_lock(spinlock_k *lock);
void spin_lock_irqsave(spinlock_k *lock,unsigned long flags);
void spin_lock_irq(spinlock_k *lock);
void spin_lock_bh(spinlock_k *lock);
void spin_lock_irqsave()會將目前硬體中斷先存起來在flags再禁止中斷,結束後恢復。 void spin_lock_irq()則不會儲存現況硬體中斷,直接禁止所有中斷。 void spin_lock_bh()上鎖前會讓軟體中斷失效。
解鎖
void spin_unlock(spinlock_k *lock);
void spin_unlock_irqrestore(spinlock_k *lock,unsigned long flags);
void spin_unlock_irq(spinlock_k *lock);
void spin_unlock_bh(spinlock_k *lock);
不進入等待上鎖
int spin_trylock(spinlock_k *lock);
int spin_trylock_bh(spinlock_k *lock);
第一時間嘗試取得鎖,若無取得鎖會傳回0,取得則傳回非0值。
spinlock,mutex,semaphore區別
mutex | semaphore | spinlock | |
---|---|---|---|
進入critical section行程 | 1 | N | 1 |
等待方式 | sleep | sleep | busy waiting |