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