Linux内核spin_lock与spin_lock_irq分析
在Linux內核中何時使用spin_lock,何時使用spin_lock_irqsave很容易混淆。首先看一下代碼是如何實現的。
spin_lock的調用關系
???? spin_lock?
??????????? |
?????????? + ----->? raw_spin_lock?
|
+------>? _raw_spin_lock
???????????????????????? |
??????????????????????? +--------> __raw_spin_lock
[cpp]?view plaincopy
spin_lock_irq的調用關系
??? spin_lock_irq
??????????????? |
?????????????? +-------> raw_spin_lock_irq
?????????????????????????????????????????? |
????????????????????????????????????????? +---------> _raw_spin_lock_irq
????????????????????????????????????????????????????????????????????? |
????????????????????????????????????????????????????????????????????? +------------> __raw_spin_lock_irq
[cpp]?view plaincopy
可以看出來他們兩者只有一個差別:是否調用local_irq_disable()函數, 即是否禁止本地中斷。
在任何情況下使用spin_lock_irq都是安全的。因為它既禁止本地中斷,又禁止內核搶占。
spin_lock比spin_lock_irq速度快,但是它并不是任何情況下都是安全的。
舉個例子:進程A中調用了spin_lock(&lock)然后進入臨界區,此時來了一個中斷(interrupt),
該中斷也運行在和進程A相同的CPU上,并且在該中斷處理程序中恰巧也會spin_lock(&lock)
試圖獲取同一個鎖。由于是在同一個CPU上被中斷,進程A會被設置為TASK_INTERRUPT狀態,
中斷處理程序無法獲得鎖,會不停的忙等,由于進程A被設置為中斷狀態,schedule()進程調度就
無法再調度進程A運行,這樣就導致了死鎖!
但是如果該中斷處理程序運行在不同的CPU上就不會觸發死鎖。 因為在不同的CPU上出現中斷不會導致
進程A的狀態被設為TASK_INTERRUPT,只是換出。當中斷處理程序忙等被換出后,進程A還是有機會
獲得CPU,執行并退出臨界區。
所以在使用spin_lock時要明確知道該鎖不會在中斷處理程序中使用。
《新程序員》:云原生和全面數字化實踐50位技術專家共同創作,文字、視頻、音頻交互閱讀總結
以上是生活随笔為你收集整理的Linux内核spin_lock与spin_lock_irq分析的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 使用 Linux 系统调用的内核命令图解
- 下一篇: Linux Device和Driver注