允许调度程序切换正在执行哪些线程的机制是什么?

时间:2018-12-05 13:59:48

标签: language-agnostic cpu

我知道cpu调度程序使用时间片,并在指定的时间段内运行线程,然后切换线程,但是我不了解CPU是如何知道停止执行线程并切换任务的。每条指令执行完后都无法重复检查时钟吗?这将花费过多的开销,这将非常浪费。我不认为它在线程上使用确定性计算来在某个指令上放置中断,在该指令中它假定到达该指令的时间已经过去,那么上下文切换如何发生? CPU如何在不不断检查时钟或其他东西的情况下停止执行?

2 个答案:

答案 0 :(得分:1)

这是计时器中断。

Interrupts是图灵完成之外的事情之一。图灵完备的机器/语言不需要实现中断。但是如果没有中断,您将很难实施时间分段或抢先式多任务操作系统。

没有中断

仍然可以在不中断的系统上实现多任务OS-使用协作多任务。旧的MacOS(在OSX之前)就是这样做的。您只是告诉应用程序开发人员,他们经常必须通过调用yield()之类的命令将执行移交给操作系统。该“产量”功能实际上是操作系统本身。协作式多任务处理当然不是理想的-您可以想象程序崩溃将导致OS永远无法执行,从而导致整个计算机瘫痪。协作式多任务处理的优点是,您可以在没有中断支持的非常简单的CPU上执行此操作。通常,它还需要更少的RAM和CPU资源。而且,作为程序员,您可以对CPU进行更多控制-例如,如果您需要真正使用100%的CPU,则可以防止操作系统占用任何CPU时间。

中断

中断只是CPU的一项功能,您可以在其中配置CPU以在发生某些情况时调用一个函数(称为中断处理程序)。对于OS程序员,最有用的是计时器中断-您可以在其中配置计时器以触发中断。触发中断后,操作系统便开始运行,并且在执行结束时,操作系统将简单地安排另一个计时器中断-这是按时间分割的多任务处理。

某些操作系统(例如Linux或实时Windows)允许您配置此计时器。 Linux将其称为jiffy,某些操作系统将其称为tick

如果您已完成任何javascript编程,这会让您感到熟悉-这几乎就像setTimeout()对程序员的表现一样。

I / O

另一种重要的中断类型是I / O中断。您的键盘实际上与I / O中断一起使用。普通PC根本不扫描键盘。取而代之的是I / O控制器(通常是USB控制器)查询键盘,如果有按键,则会向CPU发送中断信号。这将触发操作系统,并且操作系统将检查密钥属于哪个进程,并将切换到该进程以允许其接收输入-这是抢先式多任务处理。显然,在长时间没有I / O活动的情况下,抢先式多任务处理会在后台使用时间片。

答案 1 :(得分:0)

“每条指令后都无法重复检查时钟-对吗?” CPU具有特殊的设备-计时器。它有一个寄存器,其中包含剩余的警报时间,并在每个时钟滴答时递减。一旦变为零,就会引发中断。尽管当前执行的程序代码中不存在对该过程的调用,但中断的实现与过程的调用完全相同。中断过程可以进行一些规定的活动,设置另一个计时器值并返回,那么当前正在执行的程序将不会注意到此调用。或者,它可以决定驻留当前线程并让另一个线程在此处理器上执行。在这种情况下,中断过程将重新加载特殊寄存器,以便它们指向下一个线程并返回,并返回到前一段时间在另一个线程上执行的过程。

通过这种方式,处理器从一个线程切换到另一个线程,并且线程在主动和被动状态之间切换。