我最近正在阅读 Linux 内核开发,我有几个与禁用抢占相关的问题。
在第 7 章的“中断控制”部分,它说:
Moreover, disabling interrupts also disables kernel preemption.
我还从书上看到,在以下情况下会发生内核抢占:
When an interrupt handler exits, before returning to kernel-space.
When kernel code becomes preemptible again.
If a task in the kernel explicitly calls schedule()
If a task in ther kernel blocks (which results in a call to schedule())但我无法将禁用中断与这些情况联系起来。
据我所知,自旋锁会通过 preempt_disable() 函数禁用抢占。
帖子What exactly are "spin-locks"? 说:
On a single core machine a spinlock is simply a "disable interrupts" or "raise IRQL" which prevents thread scheduling completely.
preempt_disable() 是否通过禁用中断来禁用抢占?
最佳答案
我不是调度大师,但我想解释一下我的看法。 这里有几件事。
- preempt_disable() 不禁用 IRQ。它只是增加了一个
thread_info->preempt_count
变量。 - 禁用中断也会禁用抢占,因为调度程序在此之后不工作 - 但仅在单 CPU 机器上。在 SMP 上这还不够,因为当您关闭一个 CPU 上的中断时,另一个/其他人仍然异步地/做一些事情。
- Big Lock(意思是 - 关闭所有 CPU 上的所有中断)正在显着降低系统速度 - 所以这就是它不再被使用的原因。这也是 preempt_disable() 不关闭 IRQ 的原因。
可以看出什么是preempt_disable()。尝试这个: 1. 获取自旋锁。 2.调用schedule()
在 dmesg 中,您会看到类似“BUG:原子调度”的内容。当调度程序检测到您的进程处于原子(非抢占式)上下文中但它自行调度时,就会发生这种情况。
祝你好运。
关于linux - 为什么禁用中断会禁用内核抢占以及自旋锁如何禁用抢占,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20769768/