为什么不能通过硬件中断将schedule()直接称为 ? 例如,为什么我不能直接从scheduler_tick()调用schedule() ,而是必须使用need_resched标志?
我试着寻找答案,但我空手而归。任何帮助将不胜感激。
答案 0 :(得分:1)
考虑一个带有自旋锁的cpu,它现在可以提供中断。如果你安排(),你违反旋转锁拥有者的不变量不会离开CPU。请注意,大多数情况下,自旋锁不会禁用中断。有时会有与中断处理程序相关的锁,在这些情况下会使用spin_lock_irq和/或spin_lock_irqsave。
答案 1 :(得分:0)
调度发生在定时器中断上。基本规则是一次只能打开一个中断,所以如果你在"从设备X"获取数据就进入睡眠状态。中断,定时器中断无法运行以安排它。
中断也会多次发生并重叠。如果你把"得到数据"中断睡眠,然后获取更多数据,会发生什么?令人困惑(并且非常脆弱),以至于无所不能的规则是:不要在中断中睡觉。你会做错的。