x86架构中的抢占是如何工作的?

9
我很难理解preemption(抢占)的一件事情。引用维基百科:
在计算机中,preemption(更正确的是pre-emption)是指暂时中断计算机系统正在执行的任务,而不需要其合作,并且有意在以后恢复该任务。这种变化被称为上下文切换。它通常由特权任务或系统的一部分(称为抢占式调度程序)执行,该调度程序具有抢占或中断其他系统中的任务并稍后恢复的能力。
所以,基本上他们说调度程序可以打断当前运行的任务。这怎么可能? CPU此时正在运行此任务的代码,而不是调度程序的代码。那么调度程序如何去做任何事呢?
我猜肯定存在某种硬件计时器,当时间到达一定时限时,物理上中断CPU并将控制返回给调度程序。这个猜测正确吗?是否有任何文档可以让我更详细地了解它?
非常感谢您的回答。
2个回答

6

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

内核注册“处理程序”来处理这个问题。 如果你对内核设计感兴趣,这里有一个教程可能会有所帮助: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从停止的地方继续执行代码。

非常感谢。所以这个计时器存在,被称为PIT。顺便说一句,这个网站和你们太棒了。不到5分钟我就得到了满意的答案。哇! - rubix_addict

3
你的猜测是正确的。在大多数操作系统中,有一个定时器中断以固定频率在内核中运行特权代码。这个特权代码可以决定要么(a)返回原来正在运行的代码,要么(b)保存上下文并开始运行其他代码。
还有其他条件可能会导致上下文切换,比如请求从I/O读取数据,进程必须等待I/O准备好。当第一个任务等待时,内核可能会切换到其他任务。
你可能还想阅读所谓的无滴答内核

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接