0
  • 聊天消息
  • 系统消息
  • 评论与回复
登录后你可以
  • 下载海量资料
  • 学习在线课程
  • 观看技术视频
  • 写文章/发帖/加入社区
会员中心
创作中心

完善资料让更多小伙伴认识你,还能领取20积分哦,立即完善>

3天内不再提示

当 CPU 空闲时它都在做什么?

5RJg_mcuworld ? 来源:未知 ? 作者:杨鑫 ? 2018-03-06 15:43 ? 次阅读
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

操作系统行为的基本原理是,在任何一个给定的时刻,在一个 CPU 上有且只有一个任务是活动的。但是,如果 CPU 无事可做的时候,又会是什么样的呢?

事实证明,这种情况是非常普遍的,对于绝大多数的个人电脑来说,这确实是一种常态:大量的睡眠进程,它们都在等待某种情况下被唤醒,差不多在 100% 的 CPU 时间中,都处于虚构的“空闲任务”中。事实上,如果一个普通用户的 CPU 处于持续的繁忙中,它可能意味着有一个错误、bug、或者运行了恶意软件。

因为我们不能违反我们的原理,一些任务需要在一个 CPU 上激活。首先是因为,这是一个良好的设计:持续很长时间去遍历内核,检查是否有一个活动任务,这种特殊情况是不明智的做法。最好的设计是没有任何例外的情况。无论何时,你写一个 if 语句,Nyan Cat 就会喵喵喵。其次,我们需要使用空闲的 CPU 去做一些事情,让它们充满活力,你懂得,就是创建天网计划呗。

因此,保持这种设计的连续性,并领先于那些邪恶计划一步,操作系统开发者创建了一个空闲任务,当没有其它任务可做时就调度它去运行。我们可以在 Linux 的 引导过程 中看到,这个空闲任务就是进程 0,它是由计算机打开电源时运行的第一个指令直接派生出来的。它在 rest_init 中初始化,在 init_idle_bootup_task 中初始化空闲调度类scheduling class。

简而言之,Linux 支持像实时进程、普通用户进程等等的不同调度类。当选择一个进程变成活动任务时,这些类按优先级进行查询。通过这种方式,核反应堆的控制代码总是优先于 web 浏览器运行。尽管在通常情况下,这些类返回 NULL,意味着它们没有合适的任务需要去运行 —— 它们总是处于睡眠状态。但是空闲调度类,它是持续运行的,从不会失败:它总是返回空闲任务。

好吧,我们来看一下这个空闲任务到底做了些什么。下面是 cpu_idle_loop,感谢开源能让我们看到它的代码:

cpu_idle_loop

我省略了很多的细节,稍后我们将去了解任务切换,但是,如果你阅读了这些源代码,你就会找到它的要点:由于这里不需要重新调度(即改变活动任务),它一直处于空闲状态。以所经历的时间来计算,这个循环和其它操作系统中它的“堂兄弟们”相比,在计算的历史上它是运行的最多的代码片段。对于 Intel 处理器来说,处于空闲状态意味着运行着一个 halt 指令:

native_halt

hlt 指令停止处理器中的代码执行,并将它置于 halt 的状态。奇怪的是,全世界各地数以百万计的 Intel 类的 CPU 们花费大量的时间让它们处于 halt 的状态,甚至它们在通电的时候也是如此。这并不是高效、节能的做法,这促使芯片制造商们去开发处理器的深度睡眠状态,以带来着更少的功耗和更长休眠时间。内核的 cpuidle 子系统 是这些节能模式能够产生好处的原因。

现在,一旦我们告诉 CPU 去 halt(睡眠)之后,我们需要以某种方式让它醒来。如果你读过 上篇文章《你的操作系统什么时候运行?》 ,你可能会猜到中断会参与其中,而事实确实如此。中断促使 CPU 离开 halt 状态返回到激活状态。因此,将这些拼到一起,下图是当你阅读一个完全呈现的 web 网页时,你的系统主要做的事情:

定时器中断外的其它中断也会使处理器再次发生变化。如果你再次点击一个 web 页面就会产生这种变化,例如:你的鼠标发出一个中断,它的驱动会处理它,并且因为它产生了一个新的输入,突然进程就可运行了。在那个时刻, need_resched() 返回 true,然后空闲任务因你的浏览器而被踢出而终止运行。

如果我们呆呆地看着这篇文章,而不做任何事情。那么随着时间的推移,这个空闲循环就像下图一样:

在这个示例中,由内核计划的定时器中断会每 4 毫秒发生一次。这就是滴答tick周期。也就是说每秒钟将有 250 个滴答,因此,这个滴答速率(频率)是 250 Hz。这是运行在 Intel 处理器上的 Linux 的典型值,而其它操作系统喜欢使用 100 Hz。这是由你构建内核时在 CONFIG_HZ 选项中定义的。

对于一个空闲 CPU 来说,它看起来似乎是个无意义的工作。如果外部世界没有新的输入,在你的笔记本电脑的电池耗尽之前,CPU 将始终处于这种每秒钟被唤醒 250 次的地狱般折磨的小憩中。如果它运行在一个虚拟机中,那我们正在消耗着宿主机 CPU 的性能和宝贵的时钟周期。

在这里的解决方案是 动态滴答,当 CPU 处于空闲状态时,定时器中断被 暂停或重计划,直到内核知道将有事情要做时(例如,一个进程的定时器可能要在 5 秒内过期,因此,我们不能再继续睡眠了),定时器中断才会重新发出。这也被称为无滴答模式。

最后,假设在一个系统中你有一个活动进程,例如,一个长时间运行的 CPU 密集型任务。那样几乎就和一个空闲系统是相同的:这些示意图仍然是相同的,只是将空闲任务替换为这个进程,并且相应的描述也是准确的。在那种情况下,每 4 毫秒去中断一次任务仍然是无意义的:它只是操作系统的性能抖动,甚至会使你的工作变得更慢而已。Linux 也可以在这种单一进程的场景中停止这种固定速率的滴答,这被称为 自适应滴答 模式。最终,这种固定速率的滴答可能会 完全消失。

对于阅读一篇文章来说,CPU 基本是无事可做的。内核的这种空闲行为是操作系统难题的一个重要部分,并且它与我们看到的其它情况非常相似,因此,这将帮助我们理解一个运行中的内核。

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
  • cpu
    cpu
    +关注

    关注

    68

    文章

    11116

    浏览量

    218319

原文标题:当 CPU 空闲时它都在做什么?

文章出处:【微信号:mcuworld,微信公众号:嵌入式资讯精选】欢迎添加关注!文章转载请注明出处。

收藏 人收藏
加入交流群
微信小助手二维码

扫码添加小助手

加入工程师交流群

    评论

    相关推荐
    热点推荐

    STM32407使用串口闲时中断+DMA方式接收最大接收字节是多少?

    使用串口闲时中断+DMA方式接收数据,波特率为460800,DMA接收长度为1024个字节,并开启串口闲时中断,当上位机一次发送520个字节,我发现串口产生了两次中断,第一次接收的最大字节为272
    发表于 07-22 08:16

    为什么 KT142C 芯片 BUSY 脚空闲高电平仅 0.2V?附低功耗模式配置指南

    文档围绕 KT142C 芯片 busy 引脚展开,该引脚为 15 脚 PA12,播放时输出低电平,空闲时本应输出 3.3V 高电平,但芯片空闲 5 秒进入 2μA 超低功耗状态后,busy 脚呈高阻
    的头像 发表于 06-16 09:38 ?379次阅读
    为什么 KT142C 芯片 BUSY 脚<b class='flag-5'>空闲</b>高电平仅 0.2V?附低功耗模式配置指南

    DLPC7540EVM整个色段周期有80μs的时间RGB_EN都同时为低电平,请问DLP在做什么工作或者预留的这80μs是有什么用途?

    DLPC7540EVM整个色段周期有80μs的时间RGB_EN都同时为低电平,请问这个时间DLP在做什么工作或者预留的这80μs是有什么用途?
    发表于 02-24 07:20

    ADS1298读取数据时DRDY信号线的疑问求解

    在读取心电数据,DRDY会按照一定频率输出一个低电平,空闲时为高电平。但我出来的怎么刚好相反,空闲为低电平,而且我断开与MCU的链接,信号还是一样,说明和MCU的管脚配置没问题。 各位大哥,有碰到这问题的吗?
    发表于 02-08 07:48

    岁末重荐!高可靠性隔离半双工RS-485收发器-CMT83085

    CMT83085的传输速率可达12Mbps。CMT83085总线侧的总线引脚对地拥有±12kV 的系统级ESD保护,同时具有故障安全保护功能,接收器输入处于开路、短路或者总线空闲时,能确保接收器输出逻辑高。接收器的输入阻抗为1/8单位负载,允许多达256个收发器挂在总线
    的头像 发表于 01-09 16:19 ?1037次阅读
    岁末重荐!高可靠性隔离半双工RS-485收发器-CMT83085

    MAX3590 RS422 芯片 RO输出 起初的空闲时刻为低电平 怎么检测起始位

    如下图串口助手发 55 55 66 55 从上到下波形 依次是 max3490 的 A端 B端 RO端 RO端 空闲为低电平 且起始位也没有了,送到fpga端的RX引脚,无法检测起始位,数据接收都是
    发表于 12-14 17:58

    Linux之CPU调度策略和CPU亲和性

    一、调度策略 调度进程 单个 CPU一次只能执行一个进程,虽然 Linux 系统通过使用多任务同时处理多个进程,但多个进程同时运行在一个CPU 上时,通过交错执行这些进程。 内核使
    的头像 发表于 12-05 16:38 ?1260次阅读
    Linux之<b class='flag-5'>CPU</b>调度策略和<b class='flag-5'>CPU</b>亲和性

    AMC7836的SDO在空闲时为高阻,请问是否建议作上拉或者下拉?

    问题1:AMC7836的SDO在空闲时为高阻,请问是否建议作上拉或者下拉?(我看手册中典型电路好像没有上拉)然后,请问如果不作上下拉对芯片正常SPI通信是否存在较大风险? 问题2:请问
    发表于 12-05 08:20

    为什么蓝色通道的SDO空闲时会有1V左右的跟随CLK的波形?

    》, 自己用示波器测试到的时序如下; 模拟输入口的电压是固定的2.46V, 但是每次读到的值都不同; 程序如下: 问题: 1. 为什么蓝色通道的SDO空闲时会有1V左右的跟随CLK的波形? 2. 软件读不到值
    发表于 12-04 08:16

    嵌入式学习-飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi硬件原理

    ,时钟极性(CPOL)和相位(CPHA)共同决定读取数据的方式: CPOL用来决定SCLK空闲时的电平:CPOL=0,空闲时为低电平;CPOL=1,空闲时为高电平。 CPHA用来决定采样时刻:CPHA=0,每个周期的第一个时钟沿
    发表于 11-06 09:17

    飞凌嵌入式ElfBoard ELF 1板卡-spi编程示例之spi硬件原理

    ,时钟极性(CPOL)和相位(CPHA)共同决定读取数据的方式: CPOL用来决定SCLK空闲时的电平:CPOL=0,空闲时为低电平;CPOL=1,空闲时为高电平。 CPHA用来决定采样时刻:CPHA=0,每个周期的第一个时钟沿
    发表于 11-05 08:44

    为什么外设要通过接口与CPU相连

    各种任务。接口(Interface)是连接外设和CPU的桥梁,允许数据在两者之间传输。 引言 在现代计算机系统中,CPU(中央处理器)是核心组件,负责执行程序指令和处理数据。然而,CPU
    的头像 发表于 09-30 14:10 ?2530次阅读

    CPU时钟周期的组成和作用

    CPU时钟周期是计算机体系结构中一个至关重要的概念,直接关联到CPU的运行速度和性能。以下是对CPU时钟周期的定义、组成和作用的详细解析。
    的头像 发表于 09-26 15:32 ?2115次阅读

    CPU故障现象有哪些

    CPU作为计算机系统的核心部件,其稳定性和性能直接影响到整个计算机系统的运行。CPU出现故障时,会表现出多种不同的现象。以下是对CPU故障现象的详细解析,包括常见的故障类型、具体表现
    的头像 发表于 09-10 11:46 ?9634次阅读

    什么是CPU缓存?它有哪些作用?

    CPU缓存(Cache Memory)是计算机系统中一个至关重要的组成部分,位于CPU与内存之间,作为两者之间的临时存储器。CPU缓存的主要作用是减少
    的头像 发表于 08-22 14:54 ?6588次阅读