Wil*_*ate 17
示例:您的驱动程序正在执行,并且刚刚取出一个锁来控制对其设备的访问.锁定时,设备会发出中断,导致中断处理程序运行.在访问设备之前,中断处理程序还必须获得锁定.在中断处理程序中取出一个自旋锁是合法的事情; 这是自旋锁操作不睡觉的原因之一.但是,如果中断例程在与最初取出锁的代码相同的处理器中执行会发生什么?当中断处理程序正在旋转时,非中断代码将无法运行以释放锁定.那个处理器将永远旋转.
资料来源:http://www.makelinux.net/ldd3/chp-5-sect-5.shtml
这并不是说你拿着旋转锁就无法入睡.这样做是一个非常糟糕的主意.引用LDD:
因此,适用于自旋锁的核心规则是任何代码在持有自旋锁时必须是原子的.它无法入睡; 事实上,除了服务中断之外,它不能以任何理由放弃处理器(有时甚至不会).
如上所述的任何死锁都可能导致不可恢复的状态.可能发生的另一件事是自旋锁被锁定在一个CPU上,然后当线程休眠时,它会在另一个CPU上唤醒,从而导致内核崩溃.
回答Bandicoot的评论,在自旋锁上下文中,只有在单处理器可抢占内核的情况下才会禁用抢占,因为禁用抢先有效地阻止了比赛.
如果在没有CONFIG_SMP的情况下编译内核,但设置了CONFIG_PREEMPT,那么自旋锁只会禁用抢占,这足以防止任何比赛.在大多数情况下,我们可以认为抢占等同于SMP,而不是单独担心它.
http://www.kernel.org/pub/linux/kernel/people/rusty/kernel-locking/index.html
| 归档时间: |
|
| 查看次数: |
13716 次 |
| 最近记录: |