我最近正在阅读 Linux Kernel Development ,并且我有一些有关禁用抢占的问题。
此外,禁用中断也会禁用内核抢占。
我还从书中了解到,在以下情况下可能会发生内核抢占:
当中断处理程序退出时,返回内核空间。 当内核代码再次被抢占时。 如果内核中的任务显式调用schedule() 如果该内核中的任务阻塞(导致对schedule()的调用)
但是我不能将禁用中断与这些情况联系起来。
在单核计算机上,自旋锁只是一个“禁用中断”或“引发IRQL”,它完全阻止了线程调度。
preempt_disable() 是否通过禁用中断来禁用抢占?
我不是调度专家,但是我想解释一下我如何看待它。这里有几件事。
thread_info->preempt_count
您可以看到什么是preempt_disable()。尝试以下操作:1.获取一个自旋锁。2.通话时间表()
在dmesg中,您会看到类似“ BUG:原子调度”的内容。当调度程序在原子(非抢先)上下文中检测到您的进程但自行调度时,就会发生这种情况。
祝好运。