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

fei*_*iny 11 linux interrupt linux-kernel preemption spinlock

我最近正在阅读Linux内核开发,我有一些与禁用抢占相关的问题.

  1. 在第7章的"中断控制"部分,它说:

    此外,禁用中断还会禁用内核抢占.

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

    当中断处理程序退出时,返回内核空间之前.
    当内核代码再次成为可抢占状态时.
    如果内核中的任务显式调用schedule()
    如果内核中的任务阻塞(导致调用schedule())

    但我无法将禁用中断与这些情况联系起来.

  2. 据我所知,自旋锁将使用preempt_disable()函数禁用抢占.

    帖子究竟什么是"自旋锁"? 说:

    在单核心机器上,自旋锁只是"禁用中断"或"引发IRQL",这完全阻止了线程调度.

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

Seb*_*iol 11

我不是调度大师,但我想解释一下我是如何看待它的.这里有几件事.

  1. preempt_disable()不会禁用IRQ.它只是增加一个thread_info->preempt_count变量.
  2. 禁用中断还会禁用抢占,因为调度程序在此之后不起作用 - 但仅限于单CPU计算机上.在SMP上它是不够的,因为当你关闭一个CPU上的中断时,另一个/其他人仍然异步地做/做某事.
  3. Big Lock(意味着 - 关闭所有CPU上的所有中断)正在大大降低系统速度 - 所以这就是为什么它不再使用了.这也是preempt_disable()不关闭IRQ的原因.

你可以看到什么是preempt_disable().试试这个:1.获得一个旋锁.2.通话时间表()

在dmesg中,您将看到类似"BUG:schedule while atomic"的内容.当调度程序检测到您的进程处于原子(非抢占)上下文但会自行调度时,会发生这种情况.

祝好运.

  • 谢谢你的详细解答.但我仍然不明白为什么在禁用单CPU机器上的中断后调度程序无法正常工作. (2认同)