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

Operating system 当没有用户代码运行时,CPU中会发生什么?,operating-system,task,cpu,python-idle,rtos,Operating System,Task,Cpu,Python Idle,Rtos,os/rtos会安排一个“空闲任务”,这听起来很合理。那样的话,它不是很耗电吗?(执行空闲任务听起来很合理:while(true){}这取决于操作系统和CPU体系结构。在x86(与英特尔兼容)上,操作系统可能会执行指令,使CPU等待有趣的事情发生,例如硬件中断。这大概只消耗很少的能量。操作系统将执行此操作所花费的时间报告为“”,甚至可能将其分配给虚构的“空闲”进程 因此,在Windows任务管理器中,当您看到正在消耗90%的CPU时,它真正的意思是CPU没有实际的a程序来运行90%的时间 这里有

os/rtos会安排一个“空闲任务”,这听起来很合理。那样的话,它不是很耗电吗?(执行空闲任务听起来很合理:while(true){}

这取决于操作系统和CPU体系结构。在x86(与英特尔兼容)上,操作系统可能会执行指令,使CPU等待有趣的事情发生,例如硬件中断。这大概只消耗很少的能量。操作系统将执行此操作所花费的时间报告为“”,甚至可能将其分配给虚构的“空闲”进程

因此,在Windows任务管理器中,当您看到正在消耗90%的CPU时,它真正的意思是CPU没有实际的a程序来运行90%的时间


这里有一篇关于这个主题的好文章:

总是有代码要运行,如果没有其他代码,空闲任务就是代码。它可能会执行一条特殊的CPU指令,关闭CPU电源,直到出现硬件中断。在x86 CPU上,它是hlt(暂停)。

历史上有很多不同的方案,特别是在降低空闲时的功耗成为一个问题之前

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

(此方案的一个好处是,100%减去空闲进程使用的%CPU,就得到了%CPU利用率——这是操作系统设计者非常欣赏的特性。)


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

这个答案特定于基于Windows NT的操作系统

空闲线程功能 任务可能因体系结构而异,但通常是由空闲线程执行的任务:

  • 启用中断以允许传递挂起的中断
  • 禁用中断(使用
    STI
    CLI
    说明)
  • 在调试(或)构建中,查询是否附加了内核调试器,并在请求时允许断点
  • 处理延迟的过程调用
  • 检查是否有任何可运行线程可供执行。如果存在空闲处理器控制块,则使用指向线程的指针更新空闲处理器控制块
  • 检查其他处理器的队列,如果可能,安排等待在空闲处理器上执行的线程
  • 调用电源管理例程,该例程可能会停止处理器或降低CPU时钟频率,并执行其他类似的节能活动
附加信息 当逻辑处理器没有可运行线程时,Windows将执行内核模式空闲线程。只有一个空闲进程的空闲线程数与逻辑处理器的空闲线程数相同。因此,在具有4个逻辑/物理处理器的四核机器上,将有1个空闲进程和4个空闲线程

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

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

空闲线程优先级设置为0。然而,这个值实际上并不重要,因为这个线程只有在没有其他线程可运行时才能执行。空闲线程优先级永远不会与任何其他线程的优先级进行比较

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


资料来源:Windows内部。鲁西诺维奇先生。第六版。第1部分,第453-456页。

通常,空闲任务是一个“暂停”循环-停止CPU,等待中断。它运行一个垃圾邮件机器人。@HotLicks-这几乎是一个答案:)大多数ARM硬件也有几种低功耗模式。理论上,如果你的操作系统中有一个调度程序,它通常忙着等待一些事情做,您可以使用空闲优先级任务实现低功耗睡眠,该任务只在循环中运行HLT。(或调用ACPI enter powersave函数,或其他任何函数。)这会导致额外的上下文切换开销,而不是将省电构建到调度程序的繁忙等待循环中。然而,我似乎记得(早在x86低功耗空闲的早期,就像2001年的Athlon一样),如果你有一个具有Linux内核不知道的节能功能的CPU,你可以用这种方式在一个真正的程序中使用。我很想-1,因为我没有发布你的“垃圾邮件机器人”答案。但不会……)