我们知道任何时候有且只有一个进程在CPU上活动。但是如果没有任何事做时,CPU做什么呢?

这个情景是非常常见的,对于大多数的个人电脑这个场景很常见:海量的睡眠进程,都在等待特定的条件进行唤醒,接近100%的cpu时间都会进入神秘的“idle task”。实际上,如果CPU持续的繁忙,对于普通用户来说,这经常是配置错误了、出了bug或者是中毒了。

简单地说,Linux支持各种的调度类,来支持实时进程,通用用户进程等。当它需要选择一个进程活跃时,这些进程会按照优先顺序排队。通常,这些类返回NULL,意味着没有合适的进程执行,它们都处于睡眠状态。但是,idle调度类,这个最终运行的类,从不会fail,它总是会返回idle task。

让我们看看idle task究竟做了什么。如下是开源的代码中的cpu_idle_loop

while (1) {while(!need_resched()) {cpuidle_idle_call();}/*[Note: Switch to a different task. We will return to this loop when theidle task is again selected to run.]*/schedule_preempt_disabled();
}

我省略了很多细节,后面我们将会看到进程切换。但是如果你读代码,你会领略它的精髓。只要没有需要再次调度的进程时,这意味着需要改变当前活跃的进程,进入idle。按照时间测量,这个loop及其相关代码在其他的os中,是最被频繁执行的代码。对于intel处理器。保持在idle状态意味着持续运行halt执行:

//native_halt
static inline void native_halt(void)
{asm volatile("hlt": : :"memory");
}

hlt会处理器中的代码执行,并且将其进入halted状态。如果想到数百万计的Intel CP即使它们都已经开机了,还花在大量的时间在halted装填会感觉很奇怪。这也不是在灾难性的效率。考虑到能耗,芯片厂商为处理器设置了深度睡眠模式,以更长的唤醒延迟作为代价,获得了更低的功耗。内核的cpuidle subsystem就是负责利用这些节能power-saving 模式的。

现在一旦我们告诉CPU要halt或者sleep,那么我们后面也需要唤醒它们。你可能会要到利用中断来唤醒,事实上确实如此。中断会将CPU从halted 状态中唤醒并开始工作。因此,将所有的穿起来,这就是在你读一个全渲染的网页时系统可能的工作:

除了计时器中断以外的其他中断也会使处理器再次工作。当你点击网页时,你的鼠标会触发一个中断,它的驱动会处理它。这时就会有一个进程变为可执行状态,因为它有了新的输入。在那时,need_reshed()就会返回true,idle task进程就会被踢出,而处理浏览器进程。

让我们再看看idleness,如下是时间线上的idle loop。

在这个例子中,时间中断被内核设置为每4ms触发一次。这就是tick period。这意味着我们每秒tick250次。因此tick 频率是250Hz。这是linux运行在Intel处理器上的典型配置,另一个配置就是100Hz。这是在你编译内核时的CONFIG_HZ配置的。

现在看看idel cpu是不是做了大量的无用工作,的确也是这样。如果没有外界的输入,这个CPU就会陷于噩梦般的小睡,每秒被唤醒250次,最终你的电脑电量耗尽。如果这是运行在虚拟机上,那么我们就在主机上同时消耗能源和宝贵的时间。

解决方案就是有一个动态的tick,在CPU idle时,计数器中断就会被禁掉或者重新进行配置到如果我们知道何时才会有任务做的时间点。比如,如果一个进程可能需要消耗掉5s,那么CPU一定不要睡过了。这也叫做tickless mode。

最终,假设你在系统中只有一个活跃的进程,比如长时间运行CPU密集型进程。那么这接近于idle进程,上面的图内容基本一样。此时,每4ms中断一次任务可能仍然不是个好的设计,这类似于OS轻微的抖动你的任务。Linux系统也可以关闭这种单一进程的场景,叫做adaptive-tick模式。

kernel idle进程是OS谜题中的一个重要部分,它和其他的场景很类似,理解它有助于我们构建内核运行时的全景。

节选翻译自该链接

欢迎关注我的公众号《处理器与AI芯片》

【译文】CPU空闲时做什么?相关推荐

  1. 当 CPU 空闲时它都在做什么?(网上整理)

    CPU闲着的时候在干什么? Gustavo Duarte写的一篇详细文章指出,CPU空闲时并不是什么都不干,而是在运行空闲任务(idle tasks). CPU整体设计就是完成当前操作后尽可能快速地返 ...

  2. CPU 空闲时在干嘛?

    有趣! CPU 空闲时在干嘛? 人在空闲时会发呆会无聊,计算机呢? 假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛? ...

  3. CPU空闲时在忙什么

    GitHub版本: https://github.com/cncounter/translation/blob/master/tiemao_2014/CPUIdel/CPUIdel.md CPU在绝大 ...

  4. 解决WIN10“系统和压缩内存”“ntoskrnl.exe”系统空闲时占用大量CPU

    前些天装了WIN10,感觉,一般般,最近发现个怪现象,一旦机器有空闲一会,那个"系统和压缩内存"进程就会占用我20%的CPU不知道干嘛.百度一下,国内都在讨论这个进程对内存的消耗, ...

  5. VS Code 空闲时的 CPU 使用率是 13%

    (点击上方蓝字,快速关注我们) VS Code 自从推出后,在技术圈引起了很多关注.最近国外程序员 joliss 在 VS Code 的 issue 中反馈了一个问题:VS Code 处于空闲时,鼠标 ...

  6. 虚拟机服务器多线程设置,cpu核数线程做虚拟机

    cpu核数线程做虚拟机 内容精选 换一换 在服务器上运行多个虚拟机,每台虚拟机的业务不同,造成不同程度的资源占用,对于存储IO密集型的虚拟机,为了避免相邻的虚拟机的干扰,需要将不同虚拟机处理IO的存储 ...

  7. 【分析】CPU hotplug时进程上下文切换流程分析

    本文是真对<vfp 原生bug导致开机概率定屏问题>cpu down时进程上下文的保存与恢复流程做简要分析,以便更好的理解这个问题. 在分析上下文切换流程前,先要对thread_info结 ...

  8. 【译文】利用STAN做贝叶斯回归分析:Part 1 正态回归

    [译文]利用STAN做贝叶斯回归分析:Part 1 正态回归 作者 Lionel Hertzog 本文将介绍如何在R中做贝叶斯回归分析,你能在文末的参考文献中找到相关主题的更多信息. 贝叶斯回归 贝叶 ...

  9. 拯救者Y7000P 2020H款安装deepin20.5后资源空闲时经常出现风扇狂转现象

    拯救者Y7000P 2020H款安装deepin20.5后资源空闲时经常出现风扇狂转现象 记录下来备忘,不要再踩坑了!

最新文章

  1. 汇编解析(5)-intel的奔4的netburst控制单元技术提高指令处理速度
  2. Rainbond v5.1.2发布,微服务架构应用便捷管理和交付
  3. 前端组件:layui
  4. mysql主主备份_MySQL主从备份和主主备份配置+Keepalived+MySQL读写分离
  5. Codeforces Round #657 (Div. 2)
  6. leetcode 455. 分发饼干 思考分析
  7. 前端学习(2672): vue3.0脚手架路由改变
  8. php中什么是函数函数的意义是什么,php中arsort函数的功能起什么作用呢?
  9. 显示当前没有家庭组计算机,已创建家庭组且加入家庭组,但显示“当前没有其他可用的家庭组计算机?”...
  10. mysql中设置字符_MySQL中设置默认字符集的方法
  11. 多线程场景下利用ThreadLocal是线程安全?
  12. FYR的完整形式是什么?
  13. leetcode —— 48. 旋转图像
  14. redis压缩列表ziplist的连锁扩容
  15. java传奇_传奇私服登录器Java版附源代码JAVA多媒体源码下载
  16. 沪深300股指破冰金融期权衍生品市场“基建”再进一步
  17. java date iso,使用DateTimeFormat.ISO.DATE配置Jackson而不是工作
  18. 基于知识图谱的知识泛化让AI学会“举一反三”
  19. 动物电子标签阅读器识读器L8600系列选型与安装注意事项
  20. #ORA-12547: TNS: 丢失连接

热门文章

  1. python机器学习之用逻辑回归制作评分卡(个人消费类贷款数据案例实战)
  2. 土壤C、N动态对大气臭氧污染的生态学响应
  3. Postgresql 通过出生日期获取年龄
  4. 数据湖是一种方法 数据湖的四个最佳实践
  5. 基本思想(模拟)——鸡兔同笼+校门外的树+约瑟夫问题+装箱子问题+排列【POJ 1833】
  6. 区块链-工作量证明算法
  7. 配置Dot1q终结子接口实现同设备VLAN间通信
  8. gcc编译c++文件
  9. 利用geth创建私有链
  10. 一站式终端解决方案 —— MobaXterm使用宝典