Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.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
Windows 调度程序如何中断CPU?_Windows_Multithreading_Scheduler_Context Switching - Fatal编程技术网

Windows 调度程序如何中断CPU?

Windows 调度程序如何中断CPU?,windows,multithreading,scheduler,context-switching,Windows,Multithreading,Scheduler,Context Switching,所以我想知道的是,当线程调度器执行上下文切换时,CPU是如何中断的,这样切换到不同进程的任务才能完成?当新的上下文加载到CPU上时,CPU是否会暂停或进入睡眠模式?它实际上是“中断”的,这是真正意义上的“中断” 在上下文切换期间,CPU从不“暂停”。实际上它在忙着切换。触发计时器时,上下文开关启动。实际上,现有的每个CPU都有一个可配置的计时器,当它关闭时触发中断 当CPU因任何原因触发中断时,结果是CPU查找特定的内存地址,即该中断的“中断向量”。这是一个地址表,每个可能发生的中断对应一个地址

所以我想知道的是,当线程调度器执行上下文切换时,CPU是如何中断的,这样切换到不同进程的任务才能完成?当新的上下文加载到CPU上时,CPU是否会暂停或进入睡眠模式?

它实际上是“中断”的,这是真正意义上的“中断”

在上下文切换期间,CPU从不“暂停”。实际上它在忙着切换。触发计时器时,上下文开关启动。实际上,现有的每个CPU都有一个可配置的计时器,当它关闭时触发中断

当CPU因任何原因触发中断时,结果是CPU查找特定的内存地址,即该中断的“中断向量”。这是一个地址表,每个可能发生的中断对应一个地址(地址数量很少,所以这个表不是很大)。它只是说,当中断发生时,下一条指令就是该地址的任何内容。它停止运行

此地址是中断处理程序或中断服务例程(ISR)的地址,具体取决于您与谁通话。这是一个非常特殊的函数,它遵循一些非常严格的规则,以便能够在任意堆栈的顶部正常工作。对于这个处理程序,它调用调度程序,要求它进行上下文切换

调度器的设计也非常仔细,允许保存“上下文”,其中包括IP地址、堆栈配置、寄存器和虚拟内存布局等内容。然后,它选择下一个要运行的线程,加载其信息,最后将IP地址设置为上次挂起该线程时停止的位置


这个过程对CPU来说非常繁忙。它决不是闲置的。特别是,它必须刷新许多特定于体系结构的缓存,这些缓存占了切换上下文的大部分延迟。

CPU内置了中断当前程序的电路。调度程序本身就是一个程序,通常会设置周期性中断(比如每100分之一秒),然后调用调度程序。Re“下一条指令是该地址的任何内容”可能值得一提的是,中断的工作方式类似于“调用”指令,而不是“jmp”硬件保存了足够的中断线程上下文,以便ISR可以在适当的时候“返回”到它。若需要,ISR可能会选择保存更多的上下文,若调度程序决定下一个运行哪个线程,它肯定会保存所有中断的上下文。对于熟悉Internet协议的新手来说,这可能会让他们感到困惑,但是谁不习惯思考CPU寄存器,比如指令指针呢?@Solomon谢谢你的回答,但我有几个问题要问。在您的第一个回复中,您说ISR保存正在运行的上下文,但我的印象是,保存的是线程调度程序,而不是ISR。哪个是正确的实现?其次,一个正在运行的线程如何在完成一个时间片之前被抢占?@VikkiMehra对于这些细节,Solomon的描述比我的描述更精确。当触发中断并调用ISR时,它基本上“调用”ISR,将指令指针推到堆栈上,就像调用函数一样。如果需要上下文切换,附加代码(调度程序的一部分)将花费时间来正确保存其余数据。例如,实时操作系统可能会监视某些中断,并在实时线程上处理这些数据(意味着它有硬实时延迟要求)。当发出数据可用的中断信号时,它可能正在运行一些后台线程。实时操作系统可以选择立即结束后台线程的时间片并开始进行实时处理。它仍然是一个导致上下文切换的中断,只是它不是与时间切片相关联的中断。