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

results matching ""

    No results matching ""