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