根据我的理解,调度程序执行以下项:
我的问题是先发制人。例如,创建了一个新任务,它需要立即运行(它确实满足了条件--例如,它比当前正在运行的任务具有更高的优先级)。
调度程序如何知道具有较高优先级的新任务可用并需要运行。我们需要在内核实现中有一些控制代码来检测这样的任务条目,并调用Scheduler来保存当前正在运行的任务的状态,并重新安排新的任务。我想知道更多关于这样的软件实体的细节。
此外,我希望这段代码可以在CPU上运行,以控制“调度器”并使调度程序切换任务。
请告知这是如何实施或可能是我有一些差距,我的理解。
提前感谢
发布于 2015-08-09 05:16:14
理解这一点的最好方法是读一本像“X操作系统的设计”这样的书,其中X是{Unix,Linux,BSD.}之一。您应该找到一个关于上下文切换的章节和一个关于Scheduler的章节。你也可以看看switch和%28computing%29#Linux,但这本书可能更好。
基本上,当用户代码执行系统调用时(例如创建一个新进程,或释放一个信号量,或.)或者当您得到一个时钟中断,或者当您得到某种类型的其他中断时,用户进程的运行状态总是被转储到内存中,这样内核代码就可以在不扰乱用户进程的情况下运行。完成此操作后,正在运行的用户进程与任何其他可运行的用户进程都没有太大的不同。
作为服务系统调用、中断或其他工作所需工作的一部分,系统可以注意到有一个新的可运行进程或一些以前无法运行的其他进程现在是可运行的,并要求调度程序更新其最高优先级可运行进程的概念。它还可能会注意到调度量刚刚过期,并要求调度程序运行一个完整的重新调度。
一旦内核代码完成了它的任务,它可能会看到调度程序标记了最高优先级的可运行进程,内核代码将从内存中读取进程的状态,并返回到它,而不必担心是否是在系统调用之前运行的进程。
例外情况:很久以前,机器担心转储和恢复浮点寄存器的成本,而内核模式并不真正需要这样做,因为它可以编写,这样它就不会执行浮点操作。在这种情况下,可以编写保存/还原代码,以便除非必须保存浮点寄存器,否则它不会保存浮点寄存器,并且内核可能会作为恢复的一部分检查它是否切换到新进程,并需要转储和恢复浮点寄存器。据我所知,事情可能仍然是这样的,或者可能会有一些更现代的状态,只有当过程真正改变时,才会被保存和恢复。但无论是哪种情况,这都只是一个细节而已。
https://stackoverflow.com/questions/31900532
复制相似问题