调度程序如何中断CPU?

How does the scheduler interrupt the CPU?

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

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

CPU 在上下文切换期间从不“暂停”。它实际上很忙于进行切换。当定时器 interrupt 被触发时,上下文切换开始。几乎每个存在的 CPU 都有一个可配置的计时器,当它关闭时会触发中断。

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

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

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

此进程对于 CPU 来说非常繁忙。它绝不是闲置的。特别是,它必须刷新许多 architecture-specific 缓存,这占了切换上下文的大部分延迟。