天天看點

Linux中自旋鎖相關函數及使用

自旋鎖是一種輕量級的鎖定,隻能用于臨界區短的代碼段内,否則會降低系統運作的效率。

自旋鎖主要是針對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()等。

繼續閱讀