在一个内部的邮件列表里 , 有人问了这样一个问题:为什么我这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》
相关经验推荐
- CPU|若想手机用上三五年,这三点参数要达标,买对不用年年换新机
- CPU|五款新机被确认:从千元机到旗舰手机,几乎每款都令人向往
- CPU|从哪里看出一部手机的性能?这些参数告诉你
- CPU|买一台真正的“好手机”,这4个要素一定要达标,预算不够再忍忍
- CPU|高性能轻薄本CPU怎么选 i5-12500H对决R7 6800H
- Windows|超精简的Windows来袭:CPU占用率暴降!比任何一款系统都适合你
- CPU|消息传来,苹果5G芯片研发失败?高通苹果继续相爱相杀?
- CPU|vivo高配低价之作,独显芯片+骁龙888三件套+OIS防抖,仅1899元
- 传音|谷歌Chrome浏览器杀后台功能升级:降低CPU、内存占用
- CPU|2022年换手机参考这三款,功耗低性能强还不贵,可以用五年不卡顿!