Windows 任务管理器 CPU 使用率为何不准?微软前工程师揭秘背后复杂原理

天涯百科 网络资讯 2

4 月 21 日消息,曾参与为 Windows 添加 ZIP 文件支持、设计 Windows NT 开始菜单等标志性项目的微软前工程师戴夫 · 普卢默,揭秘了任务管理器读取 CPU 使用率的原理。

据了解,普卢默是原版任务管理器的开发者,他在编程和工程层面将这款工具设计得极为简洁,以确保其不会无端占用电脑资源。不过,也有不少用户抱怨,任务管理器显示的数据有时会感觉不太准确。为此,他解释了为何查询 CPU 使用率的过程相当复杂、任务管理器是如何获取 CPU 利用率数值的,以及为何其显示结果可能与你在电脑上的实际观感存在偏差。

普卢默表示:“测量 CPU 使用率听起来本该是计算机领域最简单的工作之一,我的意思是,CPU 要么处于忙碌状态,要么空闲,不是吗?它是硅基芯片,又不是即兴舞蹈。按理说,你只需要问 Windows 一句‘嘿,你忙到什么程度了?’,它就会告诉你 73%,然后大家就可以早早收工了。可事实完全不是这样。”

“因为第一个让人头疼的问题就是:‘具体在忙什么?’是单个核心忙碌还是全部核心?是此刻正在忙碌,还是过去一两秒的平均使用率,或是界面恰好刷新时的状态?忙碌是发生在用户模式、内核模式,还是中断时间、延迟过程调用、空闲循环,又或是调度程序为了统计需要而专门设立的某个特殊统计项?一旦你开始思考这些问题,原本看似简单的速度表,就会变得像司法会计核算一样复杂。”

戴夫介绍,任务管理器由计时器驱动,会每隔一段时间刷新一次,为你提供更新后的数值。这意味着,设备显示的是两次刷新间隔内电脑运行情况的统计结果,而非 CPU 实际使用率的实时视图。最简单的处理方式,本应是用 CPU 使用率除以两次刷新的间隔时长,但普卢默表示,这依赖于图形界面计时器的精准触发。他把这种方式比作“指望节拍器在颠簸土路的皮卡后斗上保持绝对稳定”。

于是,他为任务管理器编写了这样的逻辑:获取每个进程自启动以来的总运行时间,即内核时间与用户时间之和;再用该数值减去上一次刷新时记录的该进程总时间,得出这段时间内的 CPU 占用量;最后用这个数值,除以两次刷新期间所有进程占用的 CPU 总时间。相比直接用 CPU 总占用量除以刷新间隔时长,这种方法听起来更复杂,却精准得多。

然而,技术的进步让这一统计方式显得不够精准。由于该统计结果只是一个平均值,无法反映刷新间隔内某一时刻的实际工作状态。

普卢默解释道:“现代 CPU 使用率更像是衡量高速公路的拥堵程度,而非实际行驶了多少里程。半满的高速公路上跑着法拉利,其通行效率远比挤满老式水泥搅拌车的拥堵高速要高得多。”

“早年的任务管理器诞生于一个‘运行时间基本能代表完成工作量’的时代。但如今的处理器具备动态调频、睿频、温控降频、深度休眠等特性,运行时间与实际工作量的关联已经变得十分松散。所以当你觉得数值不太贴合实际时,并非工具出了故障,而是硬件不再简单到能用一个百分比就概括全部情况。”

他还在屏幕上添加了一条备注:“如果我能说了算……CPU 使用率理应衡量实际完成的工作量,与理论上可完成的最大工作量之间的比值。”但由于他已经从微软退休,如今大概率无法再对 Windows 的设计方案施加影响。