谁在 OS 中调度调度程序——这不是先有鸡还是先有蛋的场景吗?

Posted

技术标签:

【中文标题】谁在 OS 中调度调度程序——这不是先有鸡还是先有蛋的场景吗?【英文标题】:Who schedules the scheduler in OS - Isn't it a chicken and egg scenario? 【发布时间】:2011-01-16 01:30:02 【问题描述】:

谁调度调度器?

第一个任务是创建的,第一个任务是如何创建的?它不需要任何资源或内存吗?不像是先有鸡还是先有蛋的场景?

调度器不是任务吗?它是否在每个时间片结束时获取 CPU 以检查需要为哪个任务分配 CPU?

有没有什么好的环节可以让人深入思考和理解所有这些概念,而不是散布一些需要用心去思考的理论?

【问题讨论】:

没有真正的通用答案。您需要查看特定的操作系统实现。但是,@Ira 的回答可能适用于大多数操作系统。 【参考方案1】:

调度器由

调度 (外部)事件,例如中断、(磁盘完成、鼠标点击、计时器滴答) 或内部事件(例如线程完成、线程发出的需要等待某事的信号、线程释放资源的信号或线程执行引起的陷阱)像被零除这样的违法行为)

简而言之,它由可能需要运行一组任务和/或重新评估这些任务的优先级的任何事件触发。调度程序决定接下来运行哪些任务,并将控制权交给下一个任务。

通常,调度程序的这种“调度”是由与硬件中断相关的代码或与系统调用相关的代码引起的。

虽然您可以将调度程序视为一个真正的线程,但实际上它不需要以这种方式实现......因为它的执行优先级高于任何其他任务。复杂的操作系统实际上可能会留出一个 调度程序的特殊线程,并在调度程序获得控制权时将其标记为忙。这使它很漂亮,但是调度程序没有调度虚假线程

一个可以有多个调度器:最高​​优先级的一个(例如,我们刚刚描述的那个),以及其他真正是线程的调度器,并且像其他用户任务一样运行。这种较低优先级的调度程序往往用于管理间隔更长的操作,例如后台作业。

【讨论】:

同意:调度器不是一个任务,它是一个在“调度点”调用的过程。 我以前是以硬件定时器中断为主要来源来触发调度器功能的。 schuduler 函数负责所有的任务切换细节,例如上下文切换和优先级调整。但现在我发现这意味着任务切换时间是可以预测的。艾拉的回答很好。【参考方案2】:

它通常由定时 CPU 中断定期调用

【讨论】:

我不确定这是否真的增加了问题...已经有一个提到中断的答案,问题来自 2010 年。

以上是关于谁在 OS 中调度调度程序——这不是先有鸡还是先有蛋的场景吗?的主要内容,如果未能解决你的问题,请参考以下文章

用 C# 编写 C# 编译器,先有鸡还是先有蛋?

GWT RPC 序列化和循环引用——先有鸡还是先有蛋的问题

谁在OS中安排调度程序 - 这不是一个鸡蛋和鸡蛋的场景吗?

[Java]先有Class还是先有Object?

JS 究竟是先有鸡还是有蛋,Object与Function究竟谁出现的更早,Function算不算Function的实例等问题杂谈

Spring-三级缓存和循环依赖