当没有用户代码运行时,CPU会发生什么?

时间:2013-03-28 17:56:08

标签: operating-system task cpu python-idle rtos

os / rtos安排“空闲任务”听起来是合理的。在那种情况下,它不会耗电吗? (闲置任务将执行是合理的:while(true){})

4 个答案:

答案 0 :(得分:10)

这取决于操作系统和CPU架构。在x86(与Intel兼容)上,操作系统可能会执行HLT指令,使CPU等到有趣的事情发生,例如硬件中断。这应该消耗很少的能量。操作系统将执行此操作所花费的时间报告为“idle”,甚至可能将其分配给虚构的“空闲”过程。

因此,在Windows任务管理器中,您会发现System Idle Process正在消耗90%的CPU,这实际上意味着CPU没有实际的程序在90%的时间内运行。

这是一篇关于这个主题的好文章:What does an idle CPU do?

答案 1 :(得分:4)

从历史上看,有很多不同的方案,特别是在降低闲置功耗之前是一个问题。

通常,有一个“空闲”进程/任务以最低优先级运行,因此在没有其他任何操作时总能获得控制权。许多较旧的系统只是让这个过程运行一个“永远”的循环,循环体中没有任何后果。我听说过一个操作系统会在空闲过程中运行机器诊断。许多早期的PC会运行内存刷新程序(因为内存需要定期循环或者“蒸发”)。

(这种方案的一个好处是,100%减去空闲进程使用的CPU百分比可以提供%CPU利用率 - 操作系统设计人员非常喜欢的功能。)

但大多数现代系统的标准是要么运行“暂停”或“等待”指令,要么在过程控制块中有一个特殊标志,甚至更直接告诉处理器停止运行并进入节能状态模式。

答案 2 :(得分:2)

总是要运行代码,如果没有别的东西,则空闲任务就是代码。它可以执行特殊的CPU指令来关闭CPU,直到硬件中断到来。在x86 CPU上,它是hlt(暂停)。

答案 3 :(得分:2)

此答案特定于基于Windows NT的操作系统。

空闲线程功能

任务可能因架构而异,但通常这些是由空闲线程执行的任务:

  • 启用中断以允许挂起中断
  • 禁用中断(使用STICLI说明,more on wiki
  • DEBUG(或checked)版本中,查询是否附加了内核调试程序,并在请求时允许断点
  • 处理延期程序调用
  • 检查是否有任何可运行的线程准备好执行。如果有,请使用指向线程的指针更新空闲处理器控制块
  • 检查其他处理器的队列,如果可能,调度等待在空闲处理器上执行的线程
  • 调用电源管理例程,可以暂停处理器或降低CPU滴答率并执行其他类似的省电活动

其他信息

当逻辑处理器没有可运行的线程时,Windows会执行内核模式空闲线程。只有1个空闲进程具有与逻辑处理器一样多的空闲线程。因此,在具有4个逻辑/物理处理器的四核机器上,将有1个空闲进程和4个空闲线程。

在Windows中,空闲进程的ID = 0,所有空闲线程也是如此。这些对象由标准EPROCESS/KPROCESSETHREAD/KTHREAD数据结构表示。但它们不是执行管理器进程和线程对象。没有用户域地址空间,也没有执行用户域代码。

在设置进程管理器和对象管理器之前,在系统引导时静态分配空闲进程。当逻辑处理器生效时,空闲线程结构会动态分配。

空闲线程优先级设置为0.但是,此值实际上并不重要,因为此线程仅在没有其他线程可用时才会执行。空闲线程优先级永远不会与任何其他线程的优先级进行比较。

空闲线程也是preemption的特殊情况。空闲线程主例程KiIdleLoopimplementation中的reactos)执行几个不被其他线程中断的任务。当没有可用的可运行线程在处理器上运行时,该处理器在处理器控制块中被标记为空闲。然后,如果可运行的线程到达计划执行的队列,则该线程的地址指针存储在空闲处理器控制块的NextThread指针中。在空闲线程运行期间,在while循环内的每次迭代都会检查此指针地址。

来源:Windows Internals。 M. Russinovich。第6版。第1部分,第453-456页。