微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

为什么禁用中断会禁用内核抢占以及自旋锁如何禁用抢占

如何解决为什么禁用中断会禁用内核抢占以及自旋锁如何禁用抢占

我不是调度专家,但是我想解释一下我如何看待它。这里有几件事。

  1. preempt_disable() 。它只是增加一个thread_info->preempt_count变量。
  2. 禁用中断也会禁用抢占,因为调度程序在此之后不起作用-只能在单cpu计算机上使用。在SMP上这还不够,因为当您关闭一个cpu上的中断时,另一个/其他cpu仍会/异步地执行某些操作。
  3. 大锁(意味着-关闭所有cpu上的所有中断)正在极大地降低系统速度-这就是为什么不再使用它的原因。这也是preempt_disable()无法关闭IRQ的原因。

您可以看到什么是preempt_disable()。尝试以下操作:1.获取一个自旋锁。2.通话时间表()

在dmesg中,您会看到类似“ BUG:原子调度”的内容。当调度程序在原子(非抢先)上下文中检测到您的进程但自行调度时,就会发生这种情况。

祝好运。

解决方法

我最近正在阅读 Linux Kernel Development ,并且我有一些有关禁用抢占的问题。

  1. 在第7章的“中断控制”部分中,它表示:

此外,禁用中断也会禁用内核抢占。

我还从书中了解到,在以下情况下可能会发生内核抢占:

当中断处理程序退出时,返回内核空间。
当内核代码再次被抢占时。
如果内核中的任务显式调用schedule()
如果该内核中的任务阻塞(导致对schedule()的调用)

但是我不能将禁用中断与这些情况联系起来。

  1. 据我所知,自旋锁会使用 preempt_disable() 函数禁用抢占。

在单核计算机上,自旋锁只是一个“禁用中断”或“引发IRQL”,它完全阻止了线程调度。

preempt_disable() 是否通过禁用中断来禁用抢占?

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。