该进程未以 WOW64 运行,而是在 x64 环境中以 x64 运行。代码如下
DWORD64 dwProcessAffinity, dwSystemAffinity;
GetProcessAffinityMask(GetCurrentProcess(), &dwProcessAffinity, &dwSystemAffinity);
作为确认IsWow64返回错误。创建的环境有一百多个处理器。
GetProcessAffinityMask 的返回值为 BOOL,因此如果调用返回 TRUE,则调用成功。有两个掩码,一个用于进程关联,另一个用于系统关联。掩码中的每一位对应一个处理器。例如,掩码 0x10 表示处理器 4,掩码 0x03 表示处理器 0 和 1。掩码 -1 (0xffffffffffffffff) 设置了 64 位,每个处理器 0 到 63 一个位。通过使用 DWORD_PTR(而不是 DWORD64) ,可能(由原始开发人员)尝试确保后来的程序员将结果视为无符号十六进制序列而不是有符号整数,此外,这种类型会导致适当地调整掩码大小(参见下一段)。
在 Windows 2003 开发的时候,甚至 32 个处理器的系统是非常罕见的,因此将限制设置为 32(对于 32 位版本)和 64(对于 64 位版本)是合理的。即使在 2008 年的时间范围内,关于提高 Windows 2008 R2 的处理器限制的争论仍然存在,它现在支持 256,但可能会更高。运行 Windows 2003 所使用的技术已有十年之久,因此人们可以预料到当时的新技术存在一些限制。
超线程 (HT) 是一项有趣的技术。添加额外的硬件来支持另一个逻辑线程有一些好处。了解对于操作系统而言,两个逻辑处理器之间没有区别,因为不能说 X 是物理处理器而 Y 是 HT“附加组件”。硬件将 X 和 Y 视为共享资源的平等伙伴,因此操作系统平等地看待它们。
作为对您的情况的最终不确定性,我无法告诉您 Windows 2003 将使用 80 个逻辑处理器的哪个子集。它可能需要 32 个 HT 对,也可能需要物理 40 个并包括 24 个逻辑 HT 单元。您可以通过运行GetLogicalProcessorInformation来帮助回答这个问题。