CPU|思想调试:为什么4核CPU上只有一个核在工作?

CPU|思想调试:为什么4核CPU上只有一个核在工作?

在一个内部的邮件列表里 , 有人问了这样一个问题:为什么我这4核CPU的电脑上 , 看起来只有一个核在工作 , 其他三个核好像都处于空闲状态?如果使用任务管理器设置每个进程的亲缘性(Affinity)设置为4核 , 则电脑应该会运行的更快 , 这是理所当然的 。
这个时候 , 我会开始一项所谓的”思想调试” , 也许你也可以 。
第一个提示:我的直觉告诉我 , 资源管理器(Explorer)将它的亲缘性设置成只使用一个核 。 第二个提示:进程的亲缘性被其子进程所继承 。
下面是我对此问题的预测:
1. 资源管理器将线程亲缘性设置单核 。
2. 因为你预览了一个MPG视频文件 。
3. MPG的解码器在其DLL_PROCESS_ATTACH中调用了SetProcessAffinityMask 。
4. 因为解码器的作者无法修复多处理器下的Bug 。
5. 因此 , 他简单地将进程亲缘性设置为1 , 从而”修复”了这个Bug 。
虽然我的第一个预测是正确的 , 但其他几个都预测错了 。 虽然如此 , 开发团队走在了正确的路上 , 并成功地引导了进一步的问题研究 。
真正的问题原因【CPU|思想调试:为什么4核CPU上只有一个核在工作?】有一个第三方外壳扩展 , 由于它的作者无法解决扩展在多处理器运行场景下的Bug , 于是他决定 , 使用SetProcessAffinityMask来将当前进程(也即资源管理器进程)锁定到一个单一的处理器核心上 。 ”Woo-hoo , 我们一次性解决了所有多处理器Bug , 可以出去庆祝庆祝了 。 ”
因为进程的亲缘性是可以继承的 , 这导致了所有被资源管理器所启动的进程都继承了此属性 , 也即它们只会在一个核上运行 , 即使当前机器配备了一个强大且昂贵的4核CPU 。
(后记 , 我们联系了这家开发外壳扩展的公司 , 他们声称这个问题已经在其最新的版本中得到了修复 。 )
总结大多数情况下 , 你不需要设置亲缘性 , 使用系统默认的设定就好 。
在极少数情况下 , 当确实需要设置时 , 记得:你的进程的所有子进程都会继承这个设置 。
最后Raymond Chen的《The Old New Thing》是我非常喜欢的博客之一 , 里面有很多关于Windows的小知识 , 对于广大Windows平台开发者来说 , 确实十分有帮助 。
本文来自:《Psychic debugging: Why your expensive four-processor machine is ignoring three of its processors》

    相关经验推荐