【问题标题】:How does the scheduler interrupt the CPU?调度程序如何中断 CPU?
【发布时间】:2021-02-12 13:22:28
【问题描述】:

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

【问题讨论】:

  • CPU 内置了中断当前程序的电路。调度器本身就是一个程序,通常会设置周期性中断(比如每 1/100 秒),然后调用调度器。

标签: windows multithreading scheduler context-switching


【解决方案1】:

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

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

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

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

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

这个进程对 CPU 来说非常繁忙。它绝不是闲置的。特别是,它必须刷新许多特定于体系结构的缓存,这在很大程度上造成了人们看到哪些切换上下文的延迟。

【讨论】:

  • Re,“下一条指令就是那个地址” 可能值得一提的是,中断的工作方式类似于“调用”指令,而不是“jmp”。硬件保存了足够多的被中断线程的上下文,以便 ISR 可以在适当的时候“返回”到它。如果需要,ISR 可能会选择保存更多的上下文,如果是调度程序决定接下来运行哪个线程,它肯定会保存所有被中断的上下文。
  • Re, "...IP 地址..." 对于熟悉 Internet 协议但不习惯考虑 CPU 寄存器(例如指令指针)的新手来说,这可能会让他们感到困惑.
  • @Solomon 感谢您的回复,但我有几个问题要问。在您的第一个回复中,您说 ISR 保存了运行上下文,但我的印象是线程调度程序而不是 ISR 进行了保存。哪个是正确的实现?其次,正在运行的线程如何在完成时间片之前被抢占?
  • @VikkiMehra 对于这些细节,所罗门的描述比我的更准确。当触发中断并调用 ISR 时,它基本上“调用”了 ISR,将指令指针压入堆栈,就像调用函数一样。如果需要上下文切换,附加代码(调度程序的一部分)将花时间正确保存其余数据。
  • 例如,实时操作系统可能正在监视某些中断,并在实时线程上处理该数据(这意味着它具有严格的实时延迟要求)。当发生数据可用的中断信号时,它可能正在运行一些后台线程。该实时操作系统可能会选择立即结束后台线程的时间片并开始进行实时处理。它仍然是导致上下文切换的中断,只是不是与时间片相关的中断。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-12-23
  • 2021-11-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多