据我所知,CPU调度使用时间片并具有指定的时间量,线程运行,然后切换线程,但我不明白的是CPU是如何知道停止执行线程和任务切换。 它不能每个指令权后反复检查时钟? 这将花费这么多的开销,这将是非常浪费的。 我不认为它使用的线程上的一些确定性的计算将一个中断在一些指令,其中它假定将达到该指令的时间已经过去的时间,所以再怎么做上下文切换发生的呢? 如何在CPU停止执行不经常检查时钟还是什么?
Answer 1:
这是定时器中断。
中断是那些超出了图灵完备的事情之一。 图灵完备机/语言并不需要实现中断。 但是,如果没有中断,你将有一个很难实现的时间切片或抢占式多任务操作系统。
无中断
它仍然是可以实现一个系统上的多任务操作系统,而不中断 - 您使用协作多任务处理。 旧的MacOS(OSX)之前就是这么做此。 您只需告诉应用程序开发者每一个现在,那么他们必须交出执行到OS通过调用类似yield()
这种“产量”功能实际上是操作系统本身。 合作多任务当然不是理想的 - 你能想象一个程序崩溃会导致操作系统从未执行从而拿下整台机器。 合作多任务的好处是,你可以做到这一点,没有中断支持一个非常简单的CPU上。 它也通常需要少了很多的RAM和CPU资源。 而且,作为一个程序员,你必须在CPU更多的控制 - 例如,如果你需要真正使用100%的CPU就可以防止OS采取任何CPU时间。
中断
中断是CPU,你可以配置CPU调用函数的只是一个功能(称为中断处理程序)有事时。 对于OS程序员来说,最有用的是定时器中断 - 在这里你可以配置定时器触发中断。 该OS获得当触发中断运行,并在执行结束时,操作系统会简单地调度另一个定时器中断 - 这是时间片的多任务处理。
如Linux或实时的Windows操作系统的一些允许您配置此计时器。 Linux的称之为jiffy
,一些操作系统调用它tick
。
如果你已经做过任何JavaScript编程这会觉得很熟悉了-这几乎是怎么样setTimeout()
似乎表现的程序员。
I / O
中断的另一个重要类型为I / O中断。 你的键盘实际上与I / O中断工作。 普通PC完全不扫描键盘。 相反,I / O控制器(这些天,通常USB控制器的)查询键盘,如果有一个按键就会发出中断信号给CPU。 这将触发OS和OS将检查键所属的处理和将切换到进程,以允许它接收所述输入 - 这是抢先多任务。 显然,抢占式多任务的情况下,没有I / O活动的长期背景使用时间限幅器。
Answer 2:
“这不可能检查每时钟指令后反复 - 对吗?” CPU具有特殊的设备 - 计时器。 它具有包含离开报警的时间,并在每个时钟周期递减的寄存器。 当它变为零,中断提高。 中断正好实现为过程调用,虽然调用该程序是不存在于当前执行的程序代码。 中断程序可以作出一些规定的活动,设定另一个定时器的值,并返回,则当前执行的程序不会注意这个调用。 或者,它可以决定停放当前线程,并让另一个线程该处理器上执行。 在这种情况下,中断程序重新加载特殊寄存器使它们指向的是一个线程,也使得回报,并返回到这是前一段时间上执行另一个线程的程序。
这样处理器切换从一个线程到另一个,并且线程主动和被动状态之间切换。