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

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

3天内不再提示

你的计算机CPU使用率是多少?CPU空闲时在干嘛?

strongerHuang 来源:码农的荒岛求生 2023-12-05 09:27 次阅读

人空闲时会发呆会无聊,计算机呢?

假设你正在用计算机浏览网页,当网页加载完成后你开始阅读,此时你没有移动鼠标,没有敲击键盘,也没有网络通信,那么你的计算机此时在干嘛?

你的计算机 CPU 使用率是多少?

如果此时你正在计算机旁,并且安装有 Windows 或者 Linux ,你可以立刻看到自己的计算机 CPU 使用率是多少。 这是博主的一台安装有 Win10 的电脑

affbaf2c-9304-11ee-939d-92fbcf53809c.png

可以看到大部分情况下 CPU 利用率很低,也就在 8% 左右,而且开启了 283 个进程,这么多进程基本上无所事事都在等待某个特定事件来唤醒自己,就好比你写了一个打印用户输入的程序,如果用户一直不按键盘,那么你的进程就处于这种状态。 那么有的同学可能会问,剩下的 CPU 时间都去哪里了?

这个问题也很简单,还是以 Win10 为例,打开任务管理器,找到 “详细信息” 这一栏,你会发现有一个 “系统空闲进程”,其 CPU 使用率达到了 99%,正是这个进程消耗了几乎所有的 CPU 时间。

那么为什么存在这样一个进程呢?以及这个进程什么时候开始运行呢? 这就要从操作系统说起了。

程序、进程与操作系统

当你用最喜欢的代码编辑器编写代码时,这时的代码不过就是磁盘上的普通文件,此时的程序和操作系统没有半毛钱关系,操作系统也不认知这种文本文件。

b011ad2c-9304-11ee-939d-92fbcf53809c.png

程序员写完代码后开始编译,这时编译器将普通的文本文件翻译成二进制可执行文件,此时的程序依然是保存在磁盘上的文件,和普通没有本质区别。

b018f32a-9304-11ee-939d-92fbcf53809c.png

但此时不一样的是,该文件是可执行文件,也就是说操作系统开始 “懂得” 这种文件,所谓 “懂得” 是指操作系统可以识别、解析、加载,因此必定有某种类似协议的规范,这样编译器按照这种协议生成可执行文件,操作系统就能加载了。 在 Linux 下可执行文件格式为 ELF ,在 Windows 下是 EXE 。

此时虽然操作系统可以识别可执行程序,但如果你不去双击一下(或者在Linux下运行相应命令)的依然和操作系统没有半毛钱关系。

但是当你运行可执行程序时魔法就出现了。 此时操作系统开始将可执行文件加载到内存,解析出代码段、数据段等,并为这个程序创建运行时需要的堆区栈区等内存区域,此时这个程序在内存中就是这样了:

b02973b2-9304-11ee-939d-92fbcf53809c.png

最后,根据可执行文件的内容,操作系统知道该程序应该执行的第一条机器指令是什么,并将其告诉 CPU ,CPU 从该程序的第一条指令开始执行,程序就这样运行起来了。

一个在内存中运行起来的程序显然和保存在磁盘上的二进制文件是不一样的,总的有个名字吧,根据“弄不懂原则”,这个名字就叫进程,英文名叫做Process。

我们把一个运行起来的程序叫做进程,这就是进程的由来

此时操作系统开始掌管进程,现在进程已经有了,那么操作系统是怎么管理进程的呢? 实际上在很多操作系统实现中都用队列来管理进程。

b036f8fc-9304-11ee-939d-92fbcf53809c.png

那么很显然,如果队列已经为空,那么说明此时操作系统内部没有进程需要运行,这是 CPU 就空闲下来了,此时,我们需要做点什么,就像这样:

if (queue.empty()) {
  do_someting();
}
这些编写内核代码虽然简单,但内核中到处充斥着 if 这种异常处理的语句,这会让代码看起来一团糟,因此更好的设计是没有异常,那么怎样才能没有异常呢?

很简单,那就是让队列永远不会空,这样调度器永远能从队列中找到一个可供运行的进程。

而这也是为什么链表中通常会有哨兵节点的原因,就是为了避免各种判空,这样既容易出错也会让代码一团糟。

b043bf92-9304-11ee-939d-92fbcf53809c.png

就这样,内核设计者创建了一个叫做空闲任务的进程,这个进程就是Windows 下的我们最开始看到的“系统空闲进程”,在 Linux 下就是第 0号进程。

当其它进程都处于不可运行状态时,调度器就从队列中取出空闲进程运行,显然,空闲进程永远处于就绪状态,且优先级最低

既然我们已经知道了,当系统无所事事后开始运行空闲进程,那么这个空闲进程到底在干嘛呢? 这就需要硬件来帮忙了。

一切都要归结到硬件

在计算机系统中,一切最终都要靠 CPU 来驱动,CPU 才是那个真正干活的。 原来,CPU 设计者早就考虑到系统会存在空闲的可能,因此设计了一条机器指令,这个机器指令就是 halt 指令,停止的意思。

这条指令会让部分CPU进入休眠状态,从而极大减少对电力的消耗,通常这条指令也被放到循环中执行,原因也很简单,就是要维持这种休眠状态。

值得注意的是,halt 指令是特权指令,也就是说只有在内核态下 CPU 才可以执行这条指令,程序员写的应用都运行在用户态,因此你没有办法在用户态让 CPU 去执行这条指令。

软件硬件结合

现在我们有了 halt 机器指令,同时有一个循环来不停的执行 halt 指令,这样空闲任务进程的实际上就已经实现了,其本质上就是这个不断执行 halt 指令的循环,大功告成。

这样,当调度器在没有其它进程可供调度时就开始运行空间进程,也就是在循环中不断的执行 halt 指令,此时 CPU 开始进入低功耗状态。

b048247e-9304-11ee-939d-92fbcf53809c.png

在 Linux 内核中,这段代码是这样写的:

while (1) {
  while(!need_resched()) {
      cpuidle_idle_call();
  }
}
其中 cpuidle_idle_call函数最终会执行 halt 指令,注意,这里删掉了很多细节,只保留最核心代码,实际上 Linux 内核在实现空闲进程时还要考虑很多很多,不同类型的 CPU 可能会有深睡眠浅睡眠之类,操作系统必须要预测出系统可能的空闲时长并以此判断要进入哪种休眠等等,但这并不是我们关注的重点。

总的来说,这就是计算机系统空闲时 CPU 在干嘛,就是在执行这一段代码,本质上就是 CPU 在执行 halt 指令。

实际上,对于个人计算机来说,halt 可能是 CPU 执行最多的一条指令,全世界的 CPU 大部分时间都用在这条指令上了,是不是很奇怪。







审核编辑:刘清

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

    关注

    68

    文章

    10456

    浏览量

    206618
  • Linux
    +关注

    关注

    87

    文章

    10994

    浏览量

    206772
  • 计算机
    +关注

    关注

    19

    文章

    6653

    浏览量

    84609
  • LINUX内核
    +关注

    关注

    1

    文章

    311

    浏览量

    21392

原文标题:CPU 空闲时在干嘛?

文章出处:【微信号:strongerHuang,微信公众号:strongerHuang】欢迎添加关注!文章转载请注明出处。

收藏 人收藏

    评论

    相关推荐

    一种基于FreeRTOS的CPU使用率测算方法及原理介绍

    函数,即每次产生系统tick中断都会进入到此钩子函数。此钩子函数实际上就是具体计算CPU使用率的算法了。osCPU_TotalIdleTime是一个全局变量,表示1000个tick时
    发表于 08-12 16:17

    请问CPU使用率是怎么计算的?和节拍计数是什么关系?

    CPU使用率是怎么计算的啊?和统计任务中的任务计数以及空闲任务中的节拍计数是什么关系?
    发表于 06-06 03:23

    Linux系统查看CPU使用率常用的几个命令概述

    %~70%,system空间保持30%,空闲保持0%~5% 。下面总结下查看CPU使用率常用的几个命令。
    发表于 07-08 06:40

    UCOSIII统计任务如何计算CPU使用率

    如题,关于UCOSIII统计任务计算CPU使用率问题,统计任务的钩子函数中将OSStatTaskCPUUsage发到串口上显示,可是发现不屏蔽下图程序中的程序为1668,利
    发表于 05-22 00:07

    Outport对CPU使用率的影响是什么?

    时,PIL 块的 CPU 使用率变为 ~0.000208%。在这种情况下,我不确定该算法是否可以没有输出端口的情况下工作,但我想知道您的意见。
    发表于 04-03 06:44

    CPU使用率问题求解

    对于我们的 CPU 使用率分析任务,MathWorks 团队 PIL 模式下对 Nucleo-F303RE 72 MHz 板实施了一个 simulink 示例。我 MPC5775E
    发表于 04-03 09:07

    CPU 空闲时它都在做什么?

    人在空闲的时候免不了昏昏欲睡那cpu空闲时在做什么呢?
    的头像 发表于 03-06 15:43 4569次阅读
    当 <b class='flag-5'>CPU</b> <b class='flag-5'>空闲时</b>它都在做什么?

    cpu使用率忽高忽低问题原因有哪些

    cpu使用率忽高忽低可能是大量的蠕虫病毒在系统内部迅速复制,造成CPU占用资源率据高不下。
    的头像 发表于 03-01 05:21 1.7w次阅读

    cpu使用率多少算正常_cpu使用率100怎么办

    本文首先分析了cpu使用率多少算正常,其次阐述了cpu使用率100的解决方法,最后介绍了优化cpu使用率
    发表于 04-29 09:28 1.2w次阅读

    cpu使用率过高怎么解决_cpu使用率过高是什么原因

    本文主要阐述了cpu使用率过高的原因及解决方法。
    发表于 04-29 09:34 1444次阅读

    为什么明明没开多少软件,计算CPU使用率却莫名的高

    大家在用电脑的时候经常会遇到一个情况,明明自己也没开多少软件,计算CPU使用率却莫名的高。这是什么原因呢,本文中将对此进行讲解。 (任务管理器截图) 一般情况下,CPU
    的头像 发表于 02-03 17:09 2.5w次阅读
    为什么明明没开多少软件,<b class='flag-5'>计算</b>的<b class='flag-5'>CPU</b><b class='flag-5'>使用率</b>却莫名的高

    CPU使用率是什么意思

    打开电脑的任务管理器,看着跳动的CPU使用率,发现很舒服。每一个线程占用了多少CPU清清楚楚,也就能针对性的确认为啥你的电脑跑的慢了。
    的头像 发表于 05-12 10:37 8026次阅读

    使用Bolt监控CPU使用率

    电子发烧友网站提供《使用Bolt监控CPU使用率.zip》资料免费下载
    发表于 12-14 11:23 0次下载
    使用Bolt监控<b class='flag-5'>CPU</b><b class='flag-5'>使用率</b>

    什么是CPU使用率?如何测量CPU使用率

    CPU 使用率CPU计算机上执行各种任务和进程所花费的时间量的度量。
    的头像 发表于 08-06 17:07 3080次阅读

    如何在Linux系统中检查CPU使用率

    首先在Linux系统中检查CPU使用率。可以通过在命令行中输入top或htop命令来查看当前系统中各个进程的CPU使用率。如果CPU
    发表于 01-06 10:42 309次阅读
    如何在Linux系统中检查<b class='flag-5'>CPU</b><b class='flag-5'>使用率</b>