【问题标题】:Why can't schedule() be called directly from a hardware interrupt?为什么不能直接从硬件中断调用 schedule()?
【发布时间】:2016-12-12 16:42:47
【问题描述】:

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

我试图寻找答案,但我两手空空。任何帮助将不胜感激。

【问题讨论】:

    标签: linux linux-kernel scheduling


    【解决方案1】:

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

    【讨论】:

      【解决方案2】:

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

      中断也会发生多次并重叠。如果你让“得到数据”中断休眠,然后得到更多的数据,会发生什么?包罗万象的规则是:不要在中断中休眠。你会做错的。

      【讨论】:

        猜你喜欢
        • 2021-03-24
        • 1970-01-01
        • 2014-11-25
        • 1970-01-01
        • 2017-03-22
        • 1970-01-01
        • 2020-06-09
        • 2011-08-13
        • 1970-01-01
        相关资源
        最近更新 更多