为什么 Windows 任务管理器的 CPU 占用看起来会“不太对”,原作者亲自解释了原因
如果你曾经在电脑卡顿的时候打开 Windows Task Manager,然后心想:“Eh,为什么这个数字看起来怪怪的?”,那你还真不是自己想太多。
前微软工程师 Dave Plummer,也就是最初版 Task Manager 的开发者,最近解释了为什么 CPU 使用率其实比大多数人以为的更难测。Plummer 也参与过 Windows 的 ZIP 文件支持、Windows NT 开始菜单等功能开发,所以这不是什么网友随口乱讲的 hot take。这个工具,真的是他做的。
他的核心观点很简单,CPU 使用率听起来很好解释,但实际上并没有那么简单。表面看,你可能会觉得电脑只要告诉你处理器现在有多忙,不就完了吗?但现实里,问题马上就会变复杂。CPU 是只有一个核心在忙,还是所有核心都在忙?我们看的是某一个瞬间,还是过去一两秒的平均值?所谓“忙”,到底包不包括用户态工作、内核态工作、中断、deferred procedure calls,还是其他更底层的系统活动?
这也是为什么 Task Manager 没办法给你一个完美的实时读数。根据 Plummer 的说法,最初的 Task Manager 设计目标之一,就是要尽可能轻量,不能反过来浪费系统宝贵资源。它本身也是靠定时器驱动刷新,也就是说,它显示的是两次刷新之间发生了什么的“解释结果”,而不是真正的实时快照。
最直觉的做法,当然就是把 CPU 使用量除以两次更新之间的时间差。但 Plummer 说,这种算法太依赖界面定时器必须非常准时地触发。换句话说,如果定时器本身有一点不稳定,那你看到的使用率也会跟着飘。
所以他用了另一种方式。
Task Manager 不是去问“CPU 现在这一刻到底有多忙?”,而是看每个进程从启动到现在为止,总共用了多少 CPU 时间。这个总时间同时包含 kernel time 和 user time。接着在下一次刷新时,它会把这个新总量和上一次记录的数值做比较。同一个进程,两次之间的差值,就代表它在这段时间里实际消耗了多少 CPU 时间。然后再把这个数值,拿去和所有进程在同一段时间里累计的总 CPU 时间做对比。
对,比起一个简单百分比,这套逻辑确实更 mafan 一点,但对于它当年要完成的工作来说,也更准确。
更大的问题在于,现代 CPU 和最初版 Task Manager 诞生时相比,已经完全不是同一个时代的东西了。以前,CPU 花了多少时间在工作,大致就能代表它做了多少事。现在,这个关系已经弱很多了。现代处理器会不停调整自己,像是动态频率缩放、turbo boost、热降频,还有各种深度闲置状态。也就是说,就算 CPU 运行的时间一样长,实际完成的工作量也可能因为时钟速度和环境条件不同而差很多。
这就是为什么在现代硬件上,CPU 使用率这个数字会让人觉得“滑来滑去”。你的 CPU 可能显示某个百分比,但那个数字并不能完整反映它到底完成了多少真实工作。Plummer 把它比喻成高速公路车流,一条只跑了一半满、但车速很快的路,依然可能比一条塞满慢卡车的路运走更多流量。
对马来西亚和东南亚的 PC 玩家来说,这件事比你想象中更有关系。如果你是在我们这种 panas 天气里用游戏本打机,或者用一台预算型 gaming rig,长期在温度和功耗限制之间挣扎,单看 CPU 百分比很多时候真的说明不了全部情况。对于主播、电竞玩家,或者正在排查 Valorant、CS2、Dota 2、Apex 卡顿问题的人来说也是一样。有时候数字看起来“还好”,但真正的问题其实是 boost 行为、降频,或者某几个核心负载特别不均衡。
Plummer 甚至还说,如果是在理想世界里,CPU 使用率应该衡量的是“实际完成的工作量”对比“这颗芯片理论上最多能完成多少工作”。那样才会更接近真实性能表现。不过他也很坦白地说,自己都退休了,也不可能坐在沙发上就把 Windows 整套重做一遍。
至少,这件事也提醒了我们一件很实在的事,Task Manager 很有用,但它不是魔法。如果你觉得 CPU 图表看起来怪,不一定代表 Windows 坏掉了。有时候,纯粹只是因为现在的硬件已经复杂到,不是一个简简单单的百分比就能讲清楚。
来源:Tom's Hardware


