日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > linux >内容正文

linux

Linux内核spin_lock与spin_lock_irq分析

發(fā)布時間:2025/3/21 linux 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Linux内核spin_lock与spin_lock_irq分析 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

在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
  • static?inline?void?__raw_spin_lock(raw_spinlock_t?*lock)??
  • {??
  • ????????preempt_disable();??
  • ????????spin_acquire(&lock->dep_map,?0,?0,?_RET_IP_);??
  • ????????LOCK_CONTENDED(lock,?do_raw_spin_trylock,?do_raw_spin_lock);??
  • }??
  • 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
  • static?inline?void?__raw_spin_lock_irq(raw_spinlock_t?*lock)??
  • {??
  • ????????local_irq_disable();??
  • ????????preempt_disable();??
  • ????????spin_acquire(&lock->dep_map,?0,?0,?_RET_IP_);??
  • ????????LOCK_CONTENDED(lock,?do_raw_spin_trylock,?do_raw_spin_lock);??
  • }??
  • 可以看出來他們兩者只有一個差別:是否調(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)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。