调度程序代码在什么上下文中运行?

时间:2011-08-18 10:37:58

标签: linux linux-kernel scheduling interrupt

有两种情况调用调度程序代码schedule() -

  1. 当进程自愿调用schedule()

  2. 定时器中断调用schedule()

  3. 在案例2中,我认为schedule()在中断上下文中运行,但第一种情况呢?它是在调用它的进程的上下文中运行的吗?

    是否还有其他方案可以调用schedule()

3 个答案:

答案 0 :(得分:8)

schedule()始终在进程上下文中运行。在第二种情况下,当它由定时器中断启动时,它处于从内核返回到被调用schedule()的中断进程的返回路径中。

答案 1 :(得分:2)

__ schedule()是主调度函数。

驱动调度程序并因此输入此功能的主要方法是:

  1. 明确阻止:互斥,信号量,等待等等。

  2. 在中断和用户空间返回路径上检查TIF_NEED_RESCHED标志。例如,请参阅arch / x86 / entry_64.S。为了驱动任务之间的抢占,调度程序在计时器中断处理程序scheduler_tick()中设置标志。

  3. 唤醒并不会导致进入计划()。他们将任务添加到运行队列中就是这样。现在,如果添加到运行队列的新任务抢占当前任务,则唤醒设置TIF_NEED_RESCHED并在最近的可能情况下调用schedule():

    • 如果内核是可抢占的(CONFIG_PREEMPT = y):
      • 在syscall或异常上下文中,在下一个最前面的preempt_enable()中。 (这可能是wake_up()的spin_unlock()!)
      • 在IRQ上下文中,
      • 从中断处理程序返回到可抢占上下文
    • 如果内核不可抢占(未设置CONFIG_PREEMPT),则在下一个:
      • cond_resched()致电
      • 显式schedule()调用
      • 从系统调用或异常返回到用户空间
      • 从中断处理程序返回到用户空间
  4. http://lxr.free-electrons.com/source/kernel/sched/core.c#L2389

答案 2 :(得分:0)

当进程调用schedule()时,它在基于中断的系统调用上下文中运行。在第二种情况下,硬件中断触发schedule()呼叫。在这两种情况下,它都作为中断运行。 AFAIK这是schedule()被调用的唯一次,因为大多数调度操作涉及修改要调度的事物的内核运行队列,尽管可以中断进程,但通常通过中断来告诉进程产生或者过程产生自己。