【译文】CPU空闲时做什么?

我们知道任何时候有且只有一个进程在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 the
      idle 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芯片》

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值