x86架构上的抢占如何工作?

rub*_*ict 8 x86 preemption

我很难理解先发制人的一件事.引用维基百科:

在计算中,抢占(更正确地抢占)是暂时中断由计算机系统执行的任务的行为,而不需要其合作,并且意图在稍后的时间恢复任务.这种变化称为上下文切换.它通常由特权任务或称为抢占式调度程序的系统的一部分执行,该系统具有抢占,中断和稍后恢复系统中其他任务的能力.

所以,基本上,他们说调度程序可以中断当前正在运行的任务.这怎么可能呢?CPU正在运行此任务的代码,而不是调度程序的代码.那么调度程序如何任何事情呢?

我的猜测是必须有某种硬件定时器,在经过一段时间后会物理地中断CPU并将控制权交还给调度程序.它是否正确?有没有我可以更详细地阅读的文件?

任何答案都将受到高度赞赏.

lui*_*bal 5

的确。x86 架构有一个概念,称为interrupts. 一些中断由硬件触发(而其他中断可以由软件触发)。

内核注册处理此问题的“处理程序”。如果您从事内核设计,这里的教程可能会有所帮助:http : //www.osdever.net/bkerndev/Docs/gettingstarted.htm(注意:其中一些内容可能非常难,涵盖了一些不严格来说是你问题的一部分)

当中断被触发时,当前正在执行的代码被停止。CPU 将改为执行处理程序,一旦处理程序完成,将返回到触发中断之前正在执行的代码。对于应用程序,就好像中断根本没有发生过一样。

我们可以将中断处理与硬件时钟(例如 PIT 芯片)结合起来,以获得您想要的结果。

您还可以查看http://wiki.osdev.org/PIT(同样,请注意,如果您刚刚开始讨论该主题,其中一些内容可能会很复杂)。

使用 IRQ 进行抢占式多任务处理

定时器 IRQ 也可用于执行抢占式多任务。要给当前正在运行的任务一些时间来运行,请设置一个阈值,例如 3 个滴答声。使用一个像之前一样的全局变量,但从 0 开始,当该变量达到 3 时,切换任务。你怎么做取决于你。

所以:

  1. 内核通过注册适当的中断处理程序来表示“当时间到期时,我希望执行此代码”。
  2. 定时器到期,触发中断。然后执行内核注册的代码。
  3. 内核接管并保存来自停止进程的所有必需数据(例如寄存器的状态和正在执行的代码的地址),并将控制权交给不同的进程。
  4. 稍后,当内核希望第一个进程继续时,它会使用所有保存的数据将进程恢复到以前的状态。然后,它告诉 CPU 从它停止的地方继续执行代码。


Gre*_*ill 3

你的猜测是正确的。在大多数操作系统中,都有一个定时器中断,它以某个固定频率运行内核中的特权代码。该特权代码可以决定(a)返回到最初运行的代码,或者(b)保存上下文并开始运行一些其他代码。

还有其他可能导致上下文切换的条件,例如从 I/O 读取的请求,其中进程必须等待 I/O 准备就绪。当第一个任务等待时,内核可能会切换到其他任务。

您可能还有兴趣阅读所谓的无滴答内核