作者简介:
张银奎,《软件调试》和《格蠹汇编》作者,从事软件开发和研究十余年,对IA-32架构、操作系统内核、虚拟技术,尤其对软件调试有较深入的研究。
本文为《程序员》原创文章,未经允许不得转载,更多精彩文章请订阅2016年《程序员》
因为太了解软件,我很慎重在自己的电脑上安装新软件。大约半年前,有朋友通过百度云盘向我传递dump文件。点击链接下载时失败,提示超过了普通方式允许的上限,必须安装百度云盘客户端软件。于是我的电脑新增了一个软件,名曰“百度云管家”。第一次看到这个名字,就觉得很奇怪,云的家在服务器上,为什么一个终端应用程序叫云管家呢?
过了一段时间,我慢慢意识到,原来这位云管家管的不是云的家,而是我(用户电脑)的家。名字的含义或曰:“我是百度云,来管你的家”。
为什么这么认为呢?最初的原因是我发现这个管家特别忙碌,即使当我根本没有使用百度云。更让我跌破眼镜的是,即使我把网线拔掉、关闭无线,它依然忙碌。这些反常的表现让我不得不留意它了。多少次,我打开任务管理器,看它忙碌的身影。多少次,我想大声对它说:“管家大哥,你歇歇,告诉我你在忙啥?”
怎一个忙字了得
起初是在任务管理器中发现百度云管家(以下简称其“管家程序”)很忙。图1是我某次看见它忙时做的截图。在这个截图中,系统中一共运行了175个进程,任务列表是按缺页异常总数(Page Faults)排名,管家程序排名第一位,而且遥遥领先,把一向排名靠前的McAfee安全软件(第二名和第三名)远远抛在后头(相差一个数量级)。顺便说下,排在第4位的BaiduProtect是管家程序的同门兄弟,以后台服务方式运行,权限更高。
在Page Faults右侧的那一列是PF Delta,代表最近一秒钟新增的缺页异常个数,管家程序新增4千多个,但这并不是我看到的最高值,有时是7000多。再往右的一列是CPU净时间,即CPU执行管家程序的累计时间,14分37秒。这个数值也算较高了,因为系统中CPU频率高达2.6 GHz,速度很快,排在后面的很多程序(图1中未显示出)的累计时间还不到1秒。排在第二名的安全软件CPU累计时间是1小时55分42秒,比管家程序还高很多。如果把缺页异常总数除以CPU净时间,便得到缺页异常与CPU净时间的比率。这个比率反应了CPU执行程序时触发缺页异常的频繁程度,不妨将其称为缺页异常净频率。为排名前两位的两个程序计算这个指标,其结果如下:
0:000> ?? 215415833/(14*60+37)
int 0n245628
0:000> ?? 34064443/(115*60+42)
int 0n4907
可以看出管家程序触发缺页异常的净频率高得惊人,达到24万多次。这意味着CPU平均执行这个程序1秒钟就触发24万多个缺页异常。这也意味着,CPU花在这个程序上的时间有很多都用在了处理缺页异常上。
图2是使用Mark Russinovich先生的Process Explorer来观察管家程序的截图,显示的是管家程序的线程信息。
可以看到,管家程序有四个很活跃的线程,它们的CPU占用率都超过了0.1%。图2中第1列是线程ID,第2列是CPU占用率,第3列是Cycles Delta,即最近一秒钟CPU执行这个线程所用的时钟个数。从Windows Vista开始,NT内核会读取现