我正在努力理解关于先发制人的一件事。引用维基百科:
在计算中,抢占(更准确地说是先发制人)是暂时中断计算机系统正在执行的任务的行为,不需要它的合作,并且意图在以后恢复任务。这种变化称为上下文切换。它通常由特权任务或称为抢占式调度程序的系统的一部分执行,有权抢占,中断,以及稍后恢复系统中的其他任务。
因此,基本上,他们说调度程序可以中断当前正在运行的任务。这怎么可能呢? CPU正在运行此任务的代码,而不是调度程序的代码。那么调度程序如何做任何事情?
我的猜测是必须有某种硬件定时器,在经过一段时间后会物理地中断CPU并将控制权交还给调度程序。它是否正确?是否有任何文档可以更详细地阅读它?
任何答案都将受到高度赞赏。
答案 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 :(得分:3)
你的猜测是正确的。在大多数操作系统中,有一个定时器中断,它在某个固定频率上运行内核中的特权代码。此特权代码可以决定(a)返回最初运行的代码,或(b)保存上下文并开始运行其他代码。
还有其他条件可能导致上下文切换,例如从I / O读取请求,其中进程必须等待I / O准备就绪。当第一个任务正在等待时,内核可能会切换到其他任务。
您可能也有兴趣阅读所谓的tickless kernel。