Operating system 当没有用户代码运行时,CPU中会发生什么?
os/rtos会安排一个“空闲任务”,这听起来很合理。那样的话,它不是很耗电吗?(执行空闲任务听起来很合理:while(true){}这取决于操作系统和CPU体系结构。在x86(与英特尔兼容)上,操作系统可能会执行指令,使CPU等待有趣的事情发生,例如硬件中断。这大概只消耗很少的能量。操作系统将执行此操作所花费的时间报告为“”,甚至可能将其分配给虚构的“空闲”进程 因此,在Windows任务管理器中,当您看到正在消耗90%的CPU时,它真正的意思是CPU没有实际的a程序来运行90%的时间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%的时间 这里有
这里有一篇关于这个主题的好文章:总是有代码要运行,如果没有其他代码,空闲任务就是代码。它可能会执行一条特殊的CPU指令,关闭CPU电源,直到出现硬件中断。在x86 CPU上,它是hlt(暂停)。历史上有很多不同的方案,特别是在降低空闲时的功耗成为一个问题之前 通常,有一个“空闲”进程/任务以最低优先级运行,因此在没有其他事情可做时总是能够获得控制权。许多较旧的系统只是让这个过程运行一个“永远”的循环,而在循环体中没有任何结果。我听说有一个操作系统会在空闲进程中运行机器诊断。许多早期的PC都会运行内存刷新例程(因为内存需要定期循环,否则就会“蒸发”) (此方案的一个好处是,100%减去空闲进程使用的%CPU,就得到了%CPU利用率——这是操作系统设计者非常欣赏的特性。)
但大多数现代系统的标准是要么运行“暂停”或“等待”指令,要么在进程控制块中有一个特殊标志,更直接地告诉处理器停止运行并进入节能模式。这个答案特定于基于Windows NT的操作系统 空闲线程功能 任务可能因体系结构而异,但通常是由空闲线程执行的任务:
- 启用中断以允许传递挂起的中断
- 禁用中断(使用
或STI
说明)CLI
- 在调试(或)构建中,查询是否附加了内核调试器,并在请求时允许断点
- 处理延迟的过程调用
- 检查是否有任何可运行线程可供执行。如果存在空闲处理器控制块,则使用指向线程的指针更新空闲处理器控制块
- 检查其他处理器的队列,如果可能,安排等待在空闲处理器上执行的线程
- 调用电源管理例程,该例程可能会停止处理器或降低CPU时钟频率,并执行其他类似的节能活动
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,因为我没有发布你的“垃圾邮件机器人”答案。但不会……)