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

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

  1. 当一个进程自动调用schedule()

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

在情况2中,我认为schedule()运行在中断上下文中,但是第一种情况呢? 它是否在调用它的过程的上下文中运行?

还有没有更多的情况下调用schedule()

schedule()总是在进程上下文中运行。 在第二种情况下,当它由一个定时器中断启动时,它将返回从内核返回到调用schedule()的中断进程。

__schedule()是主调度器功能。

驱动调度程序的主要手段,从而进入这个功能是:

  1. 显式阻塞:互斥量,信号量,等待队列等

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

  3. 唤醒并不真正导致进入计划()。 他们添加一个任务到运行队列,就是这样。 现在,如果添加到运行队列中的新任务抢占了当前任务,那么会在最近的可能场合调用唤醒集TIF_NEED_RESCHED和schedule():

    • 如果内核是可抢占的(CONFIG_PREEMPT = y):
      • 在系统调用或异常上下文中,在下一个最上面的preempt_enable()中。 (这可能是一旦wake_up()的spin_unlock()!)
      • 在IRQ上下文中,从中断处理程序返回到可抢占上下文
    • 如果内核不可抢占(CONFIG_PREEMPT未设置),则在下一个:
      • cond_resched()调用
      • 明确的schedule()调用
      • 从系统调用或用户空间异常返回
      • 从中断处理程序返回到用户空间

http://lxr.free-electrons.com/source/kernel/sched/core.c#L2389

当进程调用schedule()它会在基于中断的系统调用上下文中运行。 在第二种情况下,硬件中断触发schedule()调用。 在这两种情况下,它都作为中断运行。 AFAIK这些是schedule()被调用的唯一时间,因为调度的大部分操作都涉及到修改内核运行队列中的事件,尽管一个进程可以被中断,但通常是通过中断来完成的,过程屈服于自身。