我正在阅读有关调度的内容,但我无法弄清楚调度程序在调用用户空间中的代码后如何重新获得控制权。
例如,调度程序将控制权传递给用户空间中的某个应用程序,该应用程序执行一些无限循环,并且在单核芯片上不会发生其他硬件中断。所有文档都谈到调度程序重新获得控制权并抢先中断用户进程,但如果控制权从未传递回操作系统,这将如何工作?
问题:调度程序是否在 CPU 中注册了某个时钟以在 X 毫秒后再次获得控制权?还是有什么其他技巧?如果不是,调用什么C 函数来注册定期(或一次?)控制权重新获得?
我正在阅读有关调度的内容,但我无法弄清楚调度程序在调用用户空间中的代码后如何重新获得控制权。
例如,调度程序将控制权传递给用户空间中的某个应用程序,该应用程序执行一些无限循环,并且在单核芯片上不会发生其他硬件中断。所有文档都谈到调度程序重新获得控制权并抢先中断用户进程,但如果控制权从未传递回操作系统,这将如何工作?
问题:调度程序是否在 CPU 中注册了某个时钟以在 X 毫秒后再次获得控制权?还是有什么其他技巧?如果不是,调用什么C 函数来注册定期(或一次?)控制权重新获得?
如果没有其他中断发生,抢占式 O/S 将不会发送,用户应用程序将永远循环。
不过,这不会发生。通常,抢占式调度程序将调度每个系统调用、每个中断和系统时钟的每个滴答声。系统时钟将始终中断,因此您的无限循环根本不会发生。
Pick 操作系统(在其开发者 Dick Pick 之后)使用非抢占式调度程序。为此系统开发的软件需要定期进行系统调用以允许内核调度其他进程。在这种环境下,内核将完全失去控制,直到进程终止。
其理由中使用的论点是在发送期间花费了大量时间来保存和恢复处理器状态。强制应用程序对此负责将允许更快的发送过程。
在 Windows 上,Sleep(0) “导致线程将其时间片的剩余部分交给任何其他准备运行的具有相同优先级的线程”。这迫使调度程序获得控制权。
在 Linux 上,sched_yield “导致调用线程放弃 CPU”。这也迫使调度程序获得控制权。
调度程序也通过中断获得控制。当一个线程消耗了它的 CPU 使用量时,调度程序会重新调度。
例如,Windows CE 允许自定义线程量。
您还可以阅读线程调度:量子、切换和调度算法。
Windows 中没有单一的调度程序。基于事件的调度代码分布在内核中。内核调度程序例程由以下事件触发:
此Microsoft 演示文稿总结了一些调度程序原则。