Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/cassandra/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Language agnostic 允许调度程序切换正在执行的线程的机制是什么?_Language Agnostic_Cpu - Fatal编程技术网

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

Language agnostic 允许调度程序切换正在执行的线程的机制是什么?,language-agnostic,cpu,Language Agnostic,Cpu,我知道cpu调度器使用时间片,让线程运行指定的时间量,然后切换线程,但我不明白的是cpu如何知道停止执行线程并切换任务。它不能在每次指令后重复检查时钟,对吗?这将占用大量的开销,这将是非常浪费的。我不认为它使用线程上的一些确定性计算在某条指令上放置一个中断,假设到达该指令的时间已经过去,那么上下文切换是如何发生的呢?CPU如何在不经常检查时钟或其他东西的情况下停止执行?这是计时器中断 是那些超越图灵完全的东西之一。图灵机/语言不需要实现中断。但是如果没有中断,您将很难实现时间片或抢占式多任务操作

我知道cpu调度器使用时间片,让线程运行指定的时间量,然后切换线程,但我不明白的是cpu如何知道停止执行线程并切换任务。它不能在每次指令后重复检查时钟,对吗?这将占用大量的开销,这将是非常浪费的。我不认为它使用线程上的一些确定性计算在某条指令上放置一个中断,假设到达该指令的时间已经过去,那么上下文切换是如何发生的呢?CPU如何在不经常检查时钟或其他东西的情况下停止执行?

这是计时器中断

是那些超越图灵完全的东西之一。图灵机/语言不需要实现中断。但是如果没有中断,您将很难实现时间片或抢占式多任务操作系统

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

打断 中断只是CPU的一项功能,您可以将CPU配置为在发生某些事情时调用函数(称为中断处理程序)。对于操作系统程序员来说,最有用的是定时器中断——您可以配置定时器来触发中断。当中断被触发时,操作系统开始运行,在执行结束时,操作系统将简单地安排另一个计时器中断——这是时间片多任务

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

如果您已经完成了任何javascript编程,这对您来说都是熟悉的-这几乎就像
setTimeout()
对程序员的行为一样

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

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

这样,处理器从一个线程切换到另一个线程,线程在主动和被动状态之间切换