所有的自旋锁等待在本质上都是不可中断的?LDD3

发布于 2022-10-15 10:11:44 字数 560 浏览 38 评论 0

今天看LDD3时自旋锁那张提到:
所有自旋锁等待在本质上都是不可中断的,一旦调用了spin_locd,在获得自旋锁之前都是处于自旋状态。”
......
"想象一会儿你的驱动请求一个自旋锁并且在它的临界区里做它的事情. 在中间某处, 你的驱动失去了处理器. 或许它已调用了一个函数( copy_from_user, 假设) 使进程进入睡眠. 或者, 也许, 内核抢占发威, 一个更高优先级的进程将你的代码推到一边. 你的代码现在持有一个锁, 在可见的将来的如何时间不会释放这个锁. 如果某个别的线程想获得同一个锁, 它会, 在最好的情况下, 等待( 在处理器中自旋 )很长时间. 最坏的情况, 系统可能完全死锁."

我觉得如果进程在等待自旋锁时如果不可中断的话,那么上面介绍的这种情况肯定是死锁,不会存在最好或是最坏情况了。是不是这样呢?

那么本质上都是不可中断的,到底是可中断还是不可中断呢?

谁能解释一下呢?
谢谢!

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(7

ゃ人海孤独症 2022-10-22 10:11:44

想你上面说的那样,肯定是死锁了,所有编程时要主要,获取自旋锁千万不要sleep

帝王念 2022-10-22 10:11:44

回复 2# zhy-linux

    那个睡眠的程序回来了释放锁就不会死锁了吧
最坏的情况应该是说,自己这个cpu请求被自己的持有的锁然后就会死锁把

云归处 2022-10-22 10:11:44

是不是多核情况下,睡眠的进程可能醒来并释放锁啊?

尘世孤行 2022-10-22 10:11:44

本帖最后由 SharkBones 于 2011-09-26 15:41 编辑

第一个问题,最好情况:获取锁的进程A比当前进程优先级低-》进程A获取不到锁-》超出时间片-》被调度出-》调度到持有锁的进程-》释放锁-》调度到进程A-》获得锁并执行。
最坏情况,若获取锁的进程A比当前进程优先级高,就会出现死锁的情况。
第二个问题:可能会发生的就一定会发生,为了避免问题一的情况,所以spinlock是不可睡眠的。

佼人 2022-10-22 10:11:44

可中断, 但是中断返回时还会回来自旋。

溺ぐ爱和你が 2022-10-22 10:11:44

本帖最后由 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的"中断"好象有点歧义,我就说有点不对劲!
我觉得用阻塞或者睡眠之类的比较无歧义!

合久必婚 2022-10-22 10:11:44

这里是LDD3的英文原文:
Therefore, the core rule
that applies to spinlocks is that any code must, w ...
asuka2001 发表于 2011-09-26 14:14

同意,LZ的第二个问题应该想是问spinlock是不是可以睡眠的

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文