2010年2月25日 星期四

Linux Synchronization - 3

Spin lock 的變化型:

spin_lock(spinlock_t *lock) & spin_unlock(spinlock_t *lock)
最基本的 Spin lock 函式,用來取得或釋放 lock。適用於多處理器系統,且共用資源會被不同的 CPU 執行的行程同時存取的情況。


spin_lock_bh(spinlock_t *lock) & spin_unlock_bh(spinlock_t *lock)
加上 Local softirq disabling 的 Spin lock 函式,關閉 Bottom half 的程序並取得 lock,或是釋放 lock 並開啟 Bottom half 的程序。
適用於多處理器系統,且共用資源會被 Bottom half 的程序所存取的情況。

spin_lock_bh(l) = local_bh_disable() + spin_lock(l)
spin_unlock_bh(l) = spin_unlock(l) + local_bh_enable()


spin_lock_irq(spinlock_t *lock) & spin_unlock_irq(spinlock_t *lock)
加上 Local interrupt disabling 的 Spin lock 函式,關閉 CPU 的中斷並取得 lock,或是釋放 lock 並開啟 CPU 的中斷。
適用於多處理器系統,且共用資源會被中斷處理函式所存取的情況。

spin_lock_irq(l) = local_irq_disable() + spin_lock(l)
spin_unlock_irq(l) = spin_unlock(l) + local_irq_enable()


spin_lock_irqsave(spinlock_t *lock, unsigned long flags) & spin_unlock_irqrestore(spinlock_t *lock, unsigned long flags)
加上 Local interrupt disabling 的 Spin lock 函式,關閉 CPU 的中斷並取得 lock,或是釋放 lock 並開啟 CPU 的中斷。
此外,在關閉中斷前會儲存中斷的狀態,以及使用該儲存的狀態來開啟中斷。
適用於多處理器系統,且共用資源會被中斷處理函式所存取,同時中斷會在呼叫 Spin lock 之前就己經關閉的場合。
這一組 spin lock 會有當釋放 lock 時,不會再啟動中斷的效果(例如巢狀的中斷)。

spin_lock_irqsave(l, f) = local_irq_save(f) + spin_lock(l)
spin_unlock_irqrestore(l, f) = spin_unlock(l) + local_irq_restore(f)


使用 Spin lock 的注意事項:

握有 lock 的行程不能進入休眠狀態或是被另一行程搶走 CPU 執行權,否則可能會讓其他想要取得同一個 lock 的行程
進入無窮的 "忙碌迴圈" 之中 ,CPU資源就會完全地被該行程給吃掉(因為握有 lock 的行程不知何時才會釋放 lock)。

沒有留言: