我不是调度专家,但是我想解释一下我如何看待它。这里有几件事。
- preempt_disable() 不会禁用IRQ 。它只是增加了一个
thread_info->preempt_count
变量。 - 禁用中断也会禁用抢占,因为调度程序在此之后不起作用-只能在单CPU计算机上使用。在SMP上这还不够,因为当您关闭一个CPU上的中断时,另一个/其他CPU仍会/异步地执行某些操作。
- 大锁(意味着-关闭所有CPU上的所有中断)正在极大地降低系统速度-这就是为什么不再使用它的原因。这也是preempt_disable()无法关闭IRQ的原因。
您可以看到什么是preempt_disable()。尝试以下操作:1.获取一个自旋锁。2.通话时间表()
在dmesg中,您会看到类似“ BUG:原子调度”的内容。当调度程序在原子(非抢先)上下文中检测到您的进程但自行调度时,就会发生这种情况。
祝好运。



