【转】spin_lock、spin_lock_irq、spin_lock_irqsave区别
為什么80%的碼農(nóng)都做不了架構(gòu)師?>>> ??
轉(zhuǎn)自: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區(qū)別
在Linux內(nèi)核中何時(shí)使用spin_lock,何時(shí)使用spin_lock_irqsave很容易混淆。首先看一下代碼是如何實(shí)現(xiàn)的。
spin_lock的調(diào)用關(guān)系
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的調(diào)用關(guān)系
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); }可以看出來他們兩者只有一個(gè)差別:是否調(diào)用local_irq_disable()函數(shù), 即是否禁止本地中斷。
在任何情況下使用spin_lock_irq都是安全的。因?yàn)樗冉贡镜刂袛?#xff0c;又禁止內(nèi)核搶占。
spin_lock比spin_lock_irq速度快,但是它并不是任何情況下都是安全的。
舉個(gè)例子:進(jìn)程A中調(diào)用了spin_lock(&lock)然后進(jìn)入臨界區(qū),此時(shí)來了一個(gè)中斷(interrupt),
該中斷也運(yùn)行在和進(jìn)程A相同的CPU上,并且在該中斷處理程序中恰巧也會(huì)spin_lock(&lock)
試圖獲取同一個(gè)鎖。由于是在同一個(gè)CPU上被中斷,進(jìn)程A會(huì)被設(shè)置為TASK_INTERRUPT狀態(tài),
中斷處理程序無法獲得鎖,會(huì)不停的忙等,由于進(jìn)程A被設(shè)置為中斷狀態(tài),schedule()進(jìn)程調(diào)度就
無法再調(diào)度進(jìn)程A運(yùn)行,這樣就導(dǎo)致了死鎖!
但是如果該中斷處理程序運(yùn)行在不同的CPU上就不會(huì)觸發(fā)死鎖。 因?yàn)樵诓煌腃PU上出現(xiàn)中斷不會(huì)導(dǎo)致
進(jìn)程A的狀態(tài)被設(shè)為TASK_INTERRUPT,只是換出。當(dāng)中斷處理程序忙等被換出后,進(jìn)程A還是有機(jī)會(huì)
獲得CPU,執(zhí)行并退出臨界區(qū)。
所以在使用spin_lock時(shí)要明確知道該鎖不會(huì)在中斷處理程序中使用。
spin_lock_irq與spin_lock_irqsave區(qū)別
spin_lock_irqsave在進(jìn)入臨界區(qū)前,保存當(dāng)前中斷寄存器flag狀態(tài),關(guān)中斷,進(jìn)入臨界區(qū),在退出臨界區(qū)時(shí),把保存的中斷狀態(tài)寫回到中斷寄存器。
spin_lock_irq在進(jìn)入臨界區(qū)前不保存中斷狀態(tài),關(guān)中斷,進(jìn)入臨界區(qū),在退出臨界區(qū)時(shí),開中斷。
spin_lock_irqsave鎖返回時(shí),中斷狀態(tài)不會(huì)被改變,調(diào)用spin_lock_irqsave前是開中斷返回就開中斷。
spin_lock_irq鎖返回時(shí),永遠(yuǎn)都是開中斷,即使spin_lock_irq前是關(guān)中斷
轉(zhuǎn)載于:https://my.oschina.net/chuqq/blog/1574545
總結(jié)
以上是生活随笔為你收集整理的【转】spin_lock、spin_lock_irq、spin_lock_irqsave区别的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 梦到自己孩子死了是什么征兆
- 下一篇: 【284天】我爱刷题系列(43)