自旋鎖是一種輕量級的鎖定,隻能用于臨界區短的代碼段内,否則會降低系統運作的效率。
自旋鎖主要是針對SMP(多核)或單核CPU但核心可搶占的情況,對于單CPU且核心不搶占的系統,自旋鎖會退化成空操作。
自旋鎖涉及的函數:
1、spin_lock_irq() = spin_lock() + local_irq_disable()
2、spin_unlock_irq() = spin_unlock() + local_irq_enable()
3、spin_lock_irqsave() = spin_lock() + local_irq_save()
4、spin_unlock_irqrestore() = spin_unlock() + local_irq_restore()
5、spin_lock_bh() = spin_lock() + local_bh_disable()
6、spin_unlock_bh() = spin_unlock() + local_bh_enable()
7、spin_lock() / spin_unlock()
其中:1-6:為适用于防止中斷和底半部的影響;7:适用于僅防止程序間的搶占排程影響
注意:
1、在多核程式設計的時候,如果程序和中斷可能通路同一個臨界資源,一般在程序上下文中調用spin_lock_irqsave()/spin_unlock_irqrestore()【可以儲存和恢複之前CPU的中斷狀态】;在中斷上下文中調用spin_lock()/spin_unlock()【因為在多核CPU中,中斷可以在多個核心中看作是程序,是以spin_lock相當于禁止了别的核程序的調用】.
2、spin_lock_irqsave()/spin_unlock_irqrestore()和spin_lock_irq()/spin_unlock_irq()的差別主要在于是否儲存中斷狀态,spin_lock_irq()/spin_unlock_irq()預設中斷狀态為全開。
3、在自旋鎖鎖定期間不能調用如下可能引起程序排程的函數:copy_from_user()、copy_to_user、kmalloc()和msleep()等。