调度程序代码有两种情况 schedule()
被援引 -
当一个进程自愿调用时
schedule()
定时器中断调用
schedule()
在案例2中,我认为 schedule()
在中断环境中运行,但第一种情况呢?它是在调用它的进程的上下文中运行的吗?
还有更多的场景可以调用 schedule()
?
调度程序代码有两种情况 schedule()
被援引 -
当一个进程自愿调用时 schedule()
定时器中断调用 schedule()
在案例2中,我认为 schedule()
在中断环境中运行,但第一种情况呢?它是在调用它的进程的上下文中运行的吗?
还有更多的场景可以调用 schedule()
?
schedule()
始终在流程上下文中运行。在第二种情况下,当它由定时器中断启动时,它处于从内核返回到中断进程的返回路径中 schedule()
叫做。
__schedule()是主调度函数。
驱动调度程序并因此进入此功能的主要方法是:
显式阻塞:互斥,信号量,等待等等
在中断和用户空间返回路径上检查TIF_NEED_RESCHED标志。例如,请参阅arch / x86 / entry_64.S。为了驱动任务之间的抢占,调度程序在计时器中断处理程序scheduler_tick()中设置标志。
唤醒并不会导致进入计划()。他们将一个任务添加到运行队列中就是这样。现在,如果添加到运行队列的新任务抢占当前任务,则唤醒设置TIF_NEED_RESCHED并在最近的可能情况下调用schedule():
http://lxr.free-electrons.com/source/kernel/sched/core.c#L2389
进程调用时 schedule()
它运行在基于中断的系统调用上下文中。在第二种情况下,硬件中断触发 schedule()
呼叫。在这两种情况下,它都作为中断运行。 AFAIK是唯一一次 schedule()
之所以被调用是因为大多数调度操作涉及修改要调度的事物的内核运行队列,尽管过程可以被中断但通常通过中断来告诉过程产生或过程产生自身。