根据我的理解,调度员会执行以下项目:
我的问题是先发制人。例如,创建了一个新任务,它需要立即运行(并且它确实满足条件 - 例如它具有比当前运行任务更高的优先级)。
调度程序如何知道具有更高优先级的新任务可用且需要运行。我们需要在内核实现中有一些控制代码来检测这样的任务条目,并调用Scheduler来保存当前运行任务的状态并重新安排新任务。我想了解有关此类软件实体的更多详细信息。
此外,我希望将此代码安排在CPU上运行以控制“调度程序”并进行调度程序切换任务。
请告知我这是如何实施的,或者我的理解上可能存在一些差距。
提前致谢
答案 0 :(得分:1)
理解这一点的最好方法是阅读一本书,例如" X操作系统的设计"其中X是{Unix,Linux,BSD ...}之一。您应该找到有关上下文切换的章节和有关调度程序的章节。您还可以查看https://en.wikipedia.org/wiki/Context_switch和https://en.wikipedia.org/wiki/Scheduling_%28computing%29#Linux,但这本书可能更好。
基本上,当用户代码执行系统调用(例如创建新进程,或释放信号量,或......)或者当您获得时钟中断时,或者当您获得某种其他中断时,用户进程的运行状态总是被转储到内存中,以便可以运行内核代码而不会弄乱用户进程。完成此操作后,正在运行的用户进程与任何其他可运行的用户进程没有太大区别。
作为服务系统调用,中断或其他任何操作所需的工作的一部分,系统可以注意到有一个新的可运行进程或者之前无法运行的其他进程现在可以运行,并询问调度程序更新其优先级最高的可运行进程的概念。它可能还注意到调度量程刚刚过期,并要求调度程序运行完整的重新调度。
一旦内核代码完成了它的内容,它可能会看到调度程序已经标记了优先级最高的可运行进程,并且内核代码将读取该进程的状态内存并返回它而不用担心关于它是在系统调用之前运行的进程还是其他任何进程。
例外:曾几何时机器担心转储和恢复浮点寄存器的成本,哪种内核模式并不真正需要,因为它可以写入以便它永远不会浮点数。在这种情况下,可能会写入保存/恢复代码,这样它就不会保存浮点寄存器,除非必须这样做,并且内核可能会在恢复过程中检查它是否正在切换到新进程,并需要转储和恢复浮点寄存器。据我所知,东西可能仍然会这样做,或者可能会有更现代的状态,只有在过程真正发生变化时才能保存和恢复。但在任何一种情况下,这都只是一个细节。