菜单
  

    在Linux内核中何时使用spin_lock,何时使用spin_lock_irqsave很容易混淆。首先看一下代码是如何实现的。

     

    spin_lock的调用关系

     

         spin_lock

                |

     

               + ----->  raw_spin_lock

     

    [cpp] view plain copy

    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

     

     

    [cpp] view plain copy

    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_irqsave在于你不期望在离开临界区后,改变中断的开启,关闭状态!进入临界区是关闭的,离开后它同样应该是关闭的!

     

    如果自旋锁在中断处理函数中被用到,那么在获取该锁之前需要关闭本地中断,spin_lock_irqsave 只是下列动作的一个便利接口:

    1 保存本地中断状态

    2 关闭本地中断

    3 获取自旋锁

     

    解锁时通过 spin_unlock_irqrestore完成释放锁、恢复本地中断到之前的状态等工作

    --------------------

     

    还有一对 spin_lock_irq 和 spin_unlock_irq

    如果你确定在获取锁之前本地中断是开启的,那么就不需要保存中断状态,解锁的时候直接将本地中断启用就可以啦

  1. 上一篇:校园网络设备选型方案
  2. 下一篇:telnet towel.blinkenlights.nl
  1. 投资和创业哪个更赚钱,...

  2. 属马的和什么属相最配相...

  3. 属虎的和什么属相最配相...

  4. 属虎的和什么属相最配相...

  5. 属猪的和什么属相最配相...

  6. 天秤男喜欢撒娇的還湜强...

  7. 为什么经商的女人不能要...

  8. 货币国际化国内外研究现状

  9. Toeplitz定理及其应用+文献综述

  10. 街头游园设计

  11. 多级反馈队列调度算法的研究+源代码

  12. 甲硫醇钠生产工艺设计任务书

  13. 运动员广告形象塑造文献综述和参考文献

  14. 从何红舟《桥上的风景》中感受油画构成美

  15. 身体自尊量表(PSPP)

  16. 玫瑰精油特征香气成分研究

  17. 进出口贸易与经济增长文献综述和参考文献

  

About

优尔论文网手机版...

主页:http://www.youerw.com

关闭返回