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

时间:2012-08-15 21:30:07

标签: x86 preemption

我正在努力理解关于先发制人的一件事。引用维基百科:

  

在计算中,抢占(更准确地说是先发制人)是暂时中断计算机系统正在执行的任务的行为,不需要它的合作,并且意图在以后恢复任务。这种变化称为上下文切换。它通常由特权任务或称为抢占式调度程序的系统的一部分执行,有权抢占,中断,以及稍后恢复系统中的其他任务。

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

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

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

2 个答案:

答案 0 :(得分:4)

事实上。 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继续执行停止的代码。

答案 1 :(得分:3)

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

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

您可能也有兴趣阅读所谓的tickless kernel