所有的自旋锁等待在本质上都是不可中断的?LDD3
今天看LDD3时自旋锁那张提到:
“所有自旋锁等待在本质上都是不可中断的,一旦调用了spin_locd,在获得自旋锁之前都是处于自旋状态。”
......
"想象一会儿你的驱动请求一个自旋锁并且在它的临界区里做它的事情. 在中间某处, 你的驱动失去了处理器. 或许它已调用了一个函数( copy_from_user, 假设) 使进程进入睡眠. 或者, 也许, 内核抢占发威, 一个更高优先级的进程将你的代码推到一边. 你的代码现在持有一个锁, 在可见的将来的如何时间不会释放这个锁. 如果某个别的线程想获得同一个锁, 它会, 在最好的情况下, 等待( 在处理器中自旋 )很长时间. 最坏的情况, 系统可能完全死锁."
我觉得如果进程在等待自旋锁时如果不可中断的话,那么上面介绍的这种情况肯定是死锁,不会存在最好或是最坏情况了。是不是这样呢?
那么本质上都是不可中断的,到底是可中断还是不可中断呢?
谁能解释一下呢?
谢谢!
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(7)
想你上面说的那样,肯定是死锁了,所有编程时要主要,获取自旋锁千万不要sleep
回复 2# zhy-linux
那个睡眠的程序回来了释放锁就不会死锁了吧
最坏的情况应该是说,自己这个cpu请求被自己的持有的锁然后就会死锁把
是不是多核情况下,睡眠的进程可能醒来并释放锁啊?
本帖最后由 SharkBones 于 2011-09-26 15:41 编辑
第一个问题,最好情况:获取锁的进程A比当前进程优先级低-》进程A获取不到锁-》超出时间片-》被调度出-》调度到持有锁的进程-》释放锁-》调度到进程A-》获得锁并执行。
最坏情况,若获取锁的进程A比当前进程优先级高,就会出现死锁的情况。
第二个问题:可能会发生的就一定会发生,为了避免问题一的情况,所以spinlock是不可睡眠的。
可中断, 但是中断返回时还会回来自旋。
本帖最后由 asuka2001 于 2011-09-26 14:25 编辑
这里是LDD3的英文原文:
Therefore, the core rule
that applies to spinlocks is that any code must, while holding a spinlock, be atomic.
It cannot sleep; in fact, it cannot relinquish the processor for any reason except to
service interrupts (and sometimes not even then).
我读着怎么这么纳闷,结果LZ的"中断"好象有点歧义,我就说有点不对劲!
我觉得用阻塞或者睡眠之类的比较无歧义!
同意,LZ的第二个问题应该想是问spinlock是不是可以睡眠的