为什么不能通过硬件中断直接调用schedule()?

为什么不能通过硬件中断直接调用schedule()? 例如,为什么我不能直接从scheduler_tick()调用schedule(),而是必须使用need_resched标志?

我试图寻找答案,但我空手而归。 任何帮助将非常感激。


调度发生在定时器中断上。 基本规则是一次只能打开一个中断,因此如果您在“从设备X获取数据”中断时进入睡眠状态,则无法运行定时器中断来安排它。

中断也会发生多次并重叠。 如果将“获取数据”中断置于睡眠状态,然后获取更多数据,会发生什么情况? 这种混淆(和脆弱)足以让全面的规则是:在中断中不睡觉。 你会做错的。


考虑一个带自旋锁的CPU,它现在可以提供中断服务。 如果你计划()出来,你违反了自旋锁所有者不会离开CPU的不变量。 请注意,大部分旋转锁不会禁用中断。 有时会有与中断处理程序相关的锁,在这些情况下,将使用spin_lock_irq和/或spin_lock_irqsave。

链接地址: http://www.djcxy.com/p/14859.html

上一篇: Why can't schedule() be called directly from a hardware interrupt?

下一篇: Prevent task from being scheduled