当 CPU 空闲时它都在做什么?(网上整理) |
您所在的位置:网站首页 › 空闲的反义词有什么呢 › 当 CPU 空闲时它都在做什么?(网上整理) |
CPU闲着的时候在干什么?
Gustavo Duarte写的一篇详细文章指出,CPU空闲时并不是什么都不干,而是在运行空闲任务(idle tasks)。 CPU整体设计就是完成当前操作后尽可能快速地返回到空闲状态,但系统必须要有某种方法/方式来唤醒芯片,让它去关注其他某些东西。 其中的一种方式是使用系统计时器(system timer)。 阻止CPU消耗太多电量的一种方法是内置更长的时钟周期(tick periods)。通过这种方式,CPU在唤醒之前需要度过更长的空闲时间,然后执行基本任务,接着再次睡眠。 什么是空闲任务(idle task)? 空闲任务可能听起来有点自相矛盾,关键是你要理解CPU既然通电,那么就必须时刻不停地在运转,即使他什么正事也不干。 对于运行在x86芯片上的Windows来说,这个功能表现为暂停(HLT)指令,对应Windows的System Idle Process进程。 Windows只有在某个CPU核心没有合适的线程可执行时,才会调用idle空闲进程去运行。 如果你查看Windows系统的任务管理器,你会看到System Idle Process(系统空闲进程)大多数时候都显示一个较高的CPU使用百分比。和进程列表中的其他进程不同,空闲进程的值越高,代表CPU的工作量越小。 设计HLT指令的目的是为了尽可能地减少电量消耗,并使CPU进入节能模式/状态。有兴趣的可以自行去google一下HLT的历史。 cpu空闲这种情况是非常普遍的,对于绝大多数的个人电脑来说,这确实是一种常态:大量的睡眠进程,它们都在等待某种情况下被唤醒,差不多在 100% 的 CPU 时间中,都处于虚构的“空闲任务”中。事实上,如果一个普通用户的 CPU 处于持续的繁忙中,它可能意味着有一个错误、bug、或者运行了恶意软件。 因此,操作系统开发者创建了一个空闲任务,当没有其它任务可做时就调度它去运行。我们可以在 Linux 的 引导过程 中看到,这个空闲任务就是进程 0,它是由计算机打开电源时运行的第一个指令直接派生出来的。它在 rest_init 中初始化,在 init_idle_bootup_task 中初始化空闲调度类scheduling class。 简而言之,Linux 支持像实时进程、普通用户进程等等的不同调度类。当选择一个进程变成活动任务时,这些类按优先级进行查询。尽管在通常情况下,这些类返回 NULL,意味着它们没有合适的任务需要去运行。但是空闲调度类,它是持续运行的,从不会失败:它总是返回空闲任务。 从Linux内核的启动源码来看,在init/main.c:start_kernel()的最后将会调用rest_init()函数,rest_init()将会进行如下调用: init/main.c:rest_init() => kernel/sched/idle.c:cpu_startup_entry() => kernel/sched/idle.c:do_idle() => kernel/sched/idle.c:cpuidle_idle_call() => kernel/sched/idle.c:default_idle_call() => arch/x86/kernel/process.c:arch_cpu_idle(),在x86平台,x86_idle被赋值为arch/x86/kernel/process.c:default_idle() => safe_halt() safe_halt()指向arch/x86/include/asm/irqflags.h:native_safe_halt() 下面是 cpu_idle_loop,感谢开源能让我们看到它的代码: while (1) { while(!need_resched()) { cpuidle_idle_call(); } schedule_preempt_disabled(); } static inline void native_halt(void) { asm volatile("hlt": : :"memory"); }我省略了很多的细节,稍后我们将去了解任务切换,但是,如果你阅读了这些源代码,你就会找到它的要点:由于这里不需要重新调度(即改变活动任务),它一直处于空闲状态。以所经历的时间来计算,这个循环和其它操作系统中它的“堂兄弟们”相比,在计算的历史上它是运行的最多的代码片段。对于 Intel 处理器来说,处于空闲状态意味着运行着一个 halt 指令. hlt 指令停止处理器中的代码执行,并将它置于 halt 的状态。奇怪的是,全世界各地数以百万计的 Intel 类的 CPU 们花费大量的时间让它们处于 halt 的状态,甚至它们在通电的时候也是如此。这并不是高效、节能的做法,这促使芯片制造商们去开发处理器的深度睡眠状态,以带来着更少的功耗和更长休眠时间。内核的 cpuidle 子系统 是这些节能模式能够产生好处的原因。 现在,一旦我们告诉 CPU 去 halt(睡眠)之后,我们需要以某种方式让它醒来。中断!!。中断促使 CPU 离开 halt 状态返回到激活状态。因此,将这些拼到一起,下图是当你阅读一个完全呈现的 web 网页时,你的系统主要做的事情: 当CPU没有可运行的任务的时候,CPU将会执行idle task(循环地执行HLT指令),即CPU执行HLT指令后,将会进入HALT状态。当CPU接收到时钟中断的时候,将会执行中断服务函数,然后继续执行idle task,进入HALT状态。如下图所示,即CPU周期性地进入HALT状态,并被唤醒,直到CPU检测到有可运行的任务。 如果我们呆呆地看着这篇文章,而不做任何事情。那么随着时间的推移,这个空闲循环就像下图一样:
对于一个空闲 CPU 来说,它看起来似乎是个无意义的工作。如果外部世界没有新的输入,在你的笔记本电脑的电池耗尽之前,CPU 将始终处于这种每秒钟被唤醒 250 次的地狱般折磨的小憩中。 最后,假设在一个系统中你有一个活动进程,例如,一个长时间运行的 CPU 密集型任务。那样几乎就和一个空闲系统是相同的:这些示意图仍然是相同的,只是将空闲任务替换为这个进程,并且相应的描述也是准确的。在那种情况下,每 4 毫秒去中断一次任务仍然是无意义的:它只是操作系统的性能抖动,甚至会使你的工作变得更慢而已。Linux 也可以在这种单一进程的场景中停止这种固定速率的滴答,这被称为 自适应滴答 模式。最终,这种固定速率的滴答可能会 完全消失。 对于阅读一篇文章来说,CPU 基本是无事可做的。内核的这种空闲行为是操作系统难题的一个重要部分,并且它与我们看到的其它情况非常相似,因此,这将帮助我们理解一个运行中的内核。 参考:https://linux.cn/article-9303-1.html 参考:https://blog.csdn.net/lindahui2008/article/details/83051411 |
今日新闻 |
点击排行 |
|
推荐新闻 |
图片新闻 |
|
专题文章 |
CopyRight 2018-2019 实验室设备网 版权所有 win10的实时保护怎么永久关闭 |