在没有硬件支持的情况下实现抢占式调度的实用方法?

问题描述

我知道使用硬件支持来实现抢占式调度可以提高效率。

我想知道,有哪些实用的方法可以在不借助硬件支持的情况下进行抢占式调度?我认为其中一种方法是软件计时器。

另外,多处理器系统中的另一种方式是使用一个处理器作为主处理器,继续查看从处理器的处理器。

考虑一下,我对低效的方式没意见。

请详细说明您认为/知道的所有可行方法。此外,最好但不一定适用于单处理器系统。

解决方法

为了抢占一个进程,操作系统必须以某种方式在没有进程合作的情况下控制 CPU。或者从另一个角度来看:CPU 必须以某种方式决定停止运行进程的代码并开始运行操作系统的代码。

就像进程不能与其他进程同时运行一样,它们也不能与操作系统同时运行。 CPU按顺序执行指令,这就是它所知道的。它不会同时运行两件事。

因此,以下是 CPU 切换到执行操作系统代码而不是进程代码的一些原因:

  • 硬件设备向该 CPU 发送中断 - 例如计时器、按键、网络数据包或硬盘驱动器完成其操作。
  • 在不同 CPU 上运行的软件向该 CPU 发送处理器间中断。
  • 正在运行的进程决定调用操作系统中的一个函数。根据 CPU 架构的不同,它可以像正常调用一样工作,也可以像假中断一样工作。
  • 正在运行的进程执行导致异常的指令,例如访问未映射的内存或除以零。
  • 某种硬件调试接口用于覆盖指令指针,导致CPU突然执行不同的代码。
  • CPU 实际上是一个模拟,操作系统正在解释进程代码,在这种情况下,操作系统可以决定随时停止解释。

如果上述情况均未发生,则操作系统代码不会运行。大多数操作系统会重新评估应该运行哪个进程,当发生硬件事件导致进程被唤醒时,还会使用定时器中断作为最后的手段,以防止一个程序占用所有 CPU 时间。

通常,当操作系统代码运行时,它没有义务返回到调用它的同一个地方。 “抢占”只是当操作系统决定跳转到调用它的地方以外的地方时。