SHH*_*SHH 7 c synchronization sleep linux-kernel spinlock
可能重复:
为什么不能在抱着螺旋锁的情况下睡觉?
据我所知,自旋锁应该在短时间内使用,并且只能在代码中选择,例如中断处理程序,其中不允许休眠(抢占).
但是,我不知道为什么会出现这样的"规则",即拿着螺旋锁时根本不应该睡觉.我知道这不是推荐的做法(因为它对性能有害),但我认为没有理由为什么睡眠不应该被允许进入自旋锁.
获取信号量时无法保持自旋锁,因为在等待信号量时可能需要休眠,而且在持有自旋锁时无法入睡(来自Robert Love的"Linux内核开发").
我能看到的唯一原因是出于可移植性的原因,因为在单处理器中,自旋锁被实现为禁用中断,并且通过禁用中断,当然不允许休眠(但是休眠不会破坏SMP系统中的代码).
但我想知道我的推理是否正确或是否还有其他原因.
bdo*_*lan 14
有几个原因,至少在Linux中,不允许在自旋锁中睡觉:
使用合适的工具做正确的工作 - 如果你需要睡觉,信号量和互斥量是你的朋友.
实际上,您可以在禁用中断或其他类型的排除活动时休眠.如果不这样做,您正在睡觉的条件可能会因中断而改变状态,然后您就永远不会醒来.睡眠代码通常永远不会在没有提升优先级的情况下进入,或者在决定睡眠和上下文切换之间包含执行路径的某些其他关键部分.
但对于自旋锁,睡眠是一种灾难,因为锁定设置.其他线程在击中时会旋转,直到你从睡眠中醒来它们才会停止旋转.与自旋锁中最坏情况下预期的一些旋转相比,这可能是永恒的,因为自旋锁只是为了同步对存储器位置的访问,它们不应该与上下文切换机制相互作用.
(就此而言,每个其他线程最终都可能会击中自旋锁,然后你就会楔入整个系统每个核心的每个线程.)