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

news/2025/2/26 4:44:04

在一个内部的邮件列表里,有人问了这样一个问题:为什么我这4核CPU的电脑上,看起来只有一个核在工作,其他三个核好像都处于空闲状态?如果使用任务管理器设置每个进程的亲缘性(Affinity)设置为4核,则电脑应该会运行的更快,这是理所当然的。

这个时候,我会开始一项所谓的”思想调试”,也许你也可以。
第一个提示:我的直觉告诉我,资源管理器(Explorer)将它的亲缘性设置成只使用一个核。第二个提示:进程的亲缘性被其子进程所继承。

下面是我对此问题的预测:
1. 资源管理器将线程亲缘性设置单核。
2. 因为你预览了一个MPG视频文件。
3. MPG的解码器在其DLL_PROCESS_ATTACH中调用了SetProcessAffinityMask。
4. 因为解码器的作者无法修复多处理器下的Bug。
5. 因此,他简单地将进程亲缘性设置为1,从而”修复”了这个Bug。

虽然我的第一个预测是正确的,但其他几个都预测错了。虽然如此,开发团队走在了正确的路上,并成功地引导了进一步的问题研究。

真正的问题原因

有一个第三方外壳扩展,由于它的作者无法解决扩展在多处理器运行场景下的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》

 


http://www.niftyadmin.cn/n/3242413.html

相关文章

实训C++语言设计——STL链表、栈类、队列

目的&#xff1a;了解了链表的定义与实现,学会了其使用方法;了解了栈类的定义和实现,学会了其使用方法;了解了队列的定义和实现,学会其使用方式;了解了c标准模板库STL的使用方式. 内容 程序&#xff1a;//Lab9_2.cpp //linkedlist.h#include<malloc.h>#ifndef LI…

实训C++语言设计——数组元素的排序查找

掌握了对数组元素的排序的方法,学会了对数组元素的查找的方法,还学习到了C库实现查找和排序. 程序&#xff1a;//Lab10_2.cpp#include<iostream>#include<algorithm>using namespace std; void displayArray(int a[],int n){ cout<<endl<<"…

Visual Studio新功能:针对Linux平台的新版SSH终端

在最新版本的Visual Studio 2022 预览版里&#xff0c;用户可以通过一项新的集成化的终端来从Windows中访问目标开发平台。这次更新的终端还包含了一个交互式的SSH外壳。用户可以通过Visual Studio中的[视图 -> 终端]来打开它&#xff0c;如下图所示&#xff1a; 现在&#…

实训C++语言设计——文件和流

熟悉流类库中常用的类及其成员函数的用法,学习到了标准的输入输出及其格式的控制,学习到了文件的应用方式,有二进制文件和文本文件. 算法&#xff1a;无方法&#xff1a;无 程序&#xff1a;//Lab11_1.cpp#include<fstream>using namespace std;#define D(a) T<<…

实训C++语言设计——异常处理

目的&#xff1a;正确理解c的异常处理机制 学习异常处理的定义及执行过程 内容&#xff1a;定义一个异常类CException &#xff0c;有成员函数Reason()&#xff0c;用来显示异常的类型&#xff0c;在子函数中触发异常&#xff0c;在主程序中处理异常&#xff0c;…

Visual Studio2010 获取时间戳c++

最近再弄时间戳&#xff0c;发现python的java的时间戳都有&#xff0c;但是唯独c的没有 网上的看了也不是真正的时间戳&#xff0c;后来研究了代码找到了系统时间戳的地方 通过调试不断跳到所需要的地方之后&#xff08;下图&#xff09;&#xff0c;找到了正在获取时间戳的函…

Android Camera2 —CameraManager API详解

一、CameraManager类概述 CameraManager是用于检测、表征和连接到 CameraDevices 的系统服务管理器。 CameraManager 是一个负责查询和建立相机连接的系统服务&#xff0c;它的功能不多&#xff0c;这里列出几个 CameraManager 的关键功能&#xff1a; 1&#xff09;、将相机…

为什么调试器会显示错误的函数

有时候在解决一些问题的时候需要使用到调试&#xff0c;这个场景很常见&#xff0c;我们在代码的某个地方设置一个断点&#xff0c;然后步进到一个函数内部单步调试&#xff0c;但是你会发现&#xff0c;调试器会显示你在另外一个函数中。这是咋回事儿&#xff1f;我们先来看看…