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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

【转】spin_lock、spin_lock_irq、spin_lock_irqsave区别

發布時間:2023/11/29 编程问答 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 【转】spin_lock、spin_lock_irq、spin_lock_irqsave区别 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

為什么80%的碼農都做不了架構師?>>> ??

轉自:http://blog.csdn.net/luckywang1103/article/details/42083613

void spin_lock(spinlock_t *lock);void spin_lock_irq(spinlock_t *lock);void spin_lock_irqsave(spinlock_t *lock, unsigned long flags);

spin_lock與spin_lock_irq區別

在Linux內核中何時使用spin_lock,何時使用spin_lock_irqsave很容易混淆。首先看一下代碼是如何實現的。

spin_lock的調用關系

spin_lock |+ -----> raw_spin_lock |+------> _raw_spin_lock|+--------> __raw_spin_lock 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的調用關系

spin_lock_irq|+-------> raw_spin_lock_irq|+---------> _raw_spin_lock_irq|+------------> __raw_spin_lock_irq 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); }

可以看出來他們兩者只有一個差別:是否調用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時要明確知道該鎖不會在中斷處理程序中使用。

spin_lock_irq與spin_lock_irqsave區別

spin_lock_irqsave在進入臨界區前,保存當前中斷寄存器flag狀態,關中斷,進入臨界區,在退出臨界區時,把保存的中斷狀態寫回到中斷寄存器。

spin_lock_irq在進入臨界區前不保存中斷狀態,關中斷,進入臨界區,在退出臨界區時,開中斷。

spin_lock_irqsave鎖返回時,中斷狀態不會被改變,調用spin_lock_irqsave前是開中斷返回就開中斷。

spin_lock_irq鎖返回時,永遠都是開中斷,即使spin_lock_irq前是關中斷

轉載于:https://my.oschina.net/chuqq/blog/1574545

總結

以上是生活随笔為你收集整理的【转】spin_lock、spin_lock_irq、spin_lock_irqsave区别的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。