GetProcessAffinityMask 将 ProcessAffinty 和 SystemAffinity 返回为

GetProcessAffinityMask returns ProcessAffinty and SystemAffinity as -1 (overflow)

本文关键字:返回 SystemAffinity ProcessAffinty GetProcessAffinityMask      更新时间:2023-10-16

该进程不是以 WOW64 运行,而是在 x64 环境中以 x64 运行。代码如下

    DWORD64 dwProcessAffinity, dwSystemAffinity;
    GetProcessAffinityMask(GetCurrentProcess(), &dwProcessAffinity, &dwSystemAffinity);

作为确认 IsWow64 返回假。创建的环境具有一百多个处理器。

GetProcessAffinityMask 的返回值是一个布尔值,因此如果调用返回了 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的处理器限制仍然存在争议,Windows 2008 R2现在支持256,但可能会更高。 运行Windows 2003使用的是十年前的技术,因此可以预期当时的新技术存在一些限制。

超线程(HT)是一项有趣的技术。 添加其他硬件以支持另一个逻辑线程有一些好处。 要知道,对于操作系统,两个逻辑处理器之间没有区别,因为不能说X是物理处理器,Y是HT"附加组件"。 硬件将 X 和 Y 视为共享资源的平等伙伴,因此操作系统平等地看待它们。

作为您情况的最终不确定性,我无法告诉您 Windows 2003 将使用 80 个逻辑处理器中的哪个子集。 它可能需要 32 个 HT 对,或者可能需要物理 40 个并包含 24 个逻辑 HT 单元。 您可以通过运行GetLogicalProcessorInformation来帮助回答这个问题。