菜单
  

    5         spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);  

    6         LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);  

    7 }  

    复制代码

    1. 禁止内核抢占,且关闭本地中断

     

    2. 那么在spin_lock中关闭了内核抢占,不关闭中断会出现什么情况呢?假如中断中也想获得这个锁,会出现和spin_lock中举得例子相同。所以这个时候,在进程A获取lock之后,使用spin_lock_irq将中断禁止,就不会出现死锁的情况

     

    3. 在任何情况下使用spin_lock_irq都是安全的。因为它既禁止本地中断,又禁止内核抢占。论文网

     

    4. spin_lock比spin_lock_irq速度快,但是它并不是任何情况下都是安全的。

     

    spin_lock_irqsave

      spin_lock_irqsave------>__raw_spin_lock_irqsave

     

     

     1 static inline unsigned long __raw_spin_lock_irqsave(raw_spinlock_t *lock)

     2 {

     3     unsigned long flags;

     4 

     5     local_irq_save(flags);

     6     preempt_disable();

     7     spin_acquire(&lock->dep_map, 0, 0, _RET_IP_);

     8     /*

     9      * On lockdep we dont want the hand-coded irq-enable of

    10      * do_raw_spin_lock_flags() code, because lockdep assumes

    11      * that interrupts are not re-enabled during lock-acquire:

    12      */

    13 #ifdef CONFIG_LOCKDEP

    14     LOCK_CONTENDED(lock, do_raw_spin_trylock, do_raw_spin_lock);

    15 #else

    16     do_raw_spin_lock_flags(lock, &flags);

    17 #endif

    18     return flags;

    19 }

    1. 禁止内核抢占,关闭中断,保存中断状态寄存器的标志位

     

    2. spin_lock_irqsave在锁返回时,之前开的中断,之后也是开的;之前关,之后也是关。但是spin_lock_irq则不管之前的开还是关,返回时都是开的(?)。

     

    3. spin_lock_irq在自旋的时候,不会保存当前的中断标志寄存器,只会在自旋结束后,将之前的中断打开。

     

    1. spin_lock/spin_unlock:

     

    进程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时要明确知道该锁不会在中断处理程序中使用。

     

    2. spin_lock_irq/spin_unlock_irq

    spin_lock_irq----->raw_spin_lock_irq

     

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

     

    3. spin_lock_irqsave/spin_unlock_irqrestore

  1. 上一篇:校园网络设备选型方案
  2. 下一篇:telnet towel.blinkenlights.nl
  1. 小学生《我和我的家乡》观后感500字

  2. 《为了和平》纪录片观后感1000字左右

  3. 《为了和平》观后感800字

  4. 《为了和平》纪录片观后感

  5. 淮安市翔和翎物流有限公...

  6. 关于大学生对传统体育项...

  7. 城市形象宣传片文献综述和参考文献

  8. 小学课堂教学效率国内外研究现状和参考文献

  9. MATLAB动车组列车牵引变流...

  10. 淮安乐天玛特连锁超市4P营销策略分析

  11. 上市公司债务税盾文献综述和参考文献

  12. 多智能体系统一致性问题研究

  13. 跨国企业全球营销策略的市场定位调查

  14. Bootstrap的OpenGL人体模型仿真

  15. PLC焊机电气控制系统设计开题报告

  16. 友谊质量调查问卷表

  17. PLC启闭机液压系统设计及其故障诊断

  

About

751论文网手机版...

主页:http://www.751com.cn

关闭返回