Operating system 调度程序如何在需要时重新获得控制权?

Operating system 调度程序如何在需要时重新获得控制权?,operating-system,cpu,scheduling,interrupt,preemption,Operating System,Cpu,Scheduling,Interrupt,Preemption,我正在读关于调度的书,但我不知道调度程序在调用用户空间中的代码后如何重新获得控制权 例如,调度器将控制权传递给用户空间中的某个应用程序,该应用程序执行一些无限循环,而单核芯片上不会发生其他硬件中断。所有文档都谈到调度器重新获得控制权并抢先中断用户进程,但是如果控制权从未传递回操作系统,那么这是如何工作的呢 问题:调度程序是否在X毫秒后向CPU中的某个时钟注册,以获得控制权?还是有别的把戏?如果否,调用什么C函数来注册常规(或一次性)控件恢复 如果没有其他中断发生,抢占式O/S将不会发送,用户应用

我正在读关于调度的书,但我不知道调度程序在调用用户空间中的代码后如何重新获得控制权

例如,调度器将控制权传递给用户空间中的某个应用程序,该应用程序执行一些无限循环,而单核芯片上不会发生其他硬件中断。所有文档都谈到调度器重新获得控制权并抢先中断用户进程,但是如果控制权从未传递回操作系统,那么这是如何工作的呢


问题:调度程序是否在X毫秒后向CPU中的某个时钟注册,以获得控制权?还是有别的把戏?如果否,调用什么C函数来注册常规(或一次性)控件恢复

如果没有其他中断发生,抢占式O/S将不会发送,用户应用程序将永远循环

但这不会发生。通常,抢占式调度程序会在每次系统调用、每次中断和系统时钟的每个滴答声时进行调度。系统时钟总是会中断,因此您的无限循环根本不会发生

(在开发人员迪克·皮克(Dick Pick)之后)使用了非抢占式调度程序。为该系统开发的软件需要定期进行系统调用,以允许内核分派其他进程。在这种环境中,内核将完全失去控制,直到进程终止

其理由中使用的论点是,在发送过程中,保存和恢复处理器状态花费了大量时间。强制应用程序对此负责将允许更快的调度过程。

在Windows上,“导致线程将其剩余时间片放弃给任何其他具有相同优先级的线程,该线程准备运行”。这将强制调度程序获得控制权

在Linux上,“导致调用线程放弃CPU”。这也迫使调度程序获得控制权

调度器也通过中断获得控制权。当线程消耗了其CPU使用量时,调度程序将重新调度

例如,Windows CE允许自定义线程数量

你也可以阅读

Windows中没有单一的计划程序。基于事件的调度代码分布在整个内核中。内核调度程序例程由以下事件触发:

  • 线程已准备好执行
  • 线程量已过期
  • 线程优先级更改
  • 线程处理器相关性更改
  • 等待功能和睡眠功能

Microsoft演示文稿总结了一些调度程序原则。

您的最后一句话很有意思。我知道这一点,但从技术层面上讲,这种恢复是如何起作用的呢?如果调度程序尚未处于控制状态,则无法主动获得控制权,因此,如果用户线程未使用
sleep
或任何其他系统调用来返回控制权,则必须存在第三个实体。你说得对,我认为这是误导。调度器经常通过中断实体获得控制,并检查线程是否已经消耗了它们的量。因此,is检测线程何时完成其量程并重新调度。我通过编辑在回答中说得更清楚了。