c++ - GetProcessAffinityMask 将 ProcessAffinty 和 SystemAffinity 返回为 -1(溢出)

标签 c++ windows winapi

该进程未作为 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 处理器限制的争论,Windows 2008 R2 现在支持 256 个,但可能会更高。运行 Windows 2003 使用的技术已有十年历史,因此可以预料到当时的新技术会受到一些限制。

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

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

关于c++ - GetProcessAffinityMask 将 ProcessAffinty 和 SystemAffinity 返回为 -1(溢出),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10877182/

相关文章:

c++ - 我应该如何针对 SDL 中的多个按钮缩放此值?

c++ - 预处理器定义在 Release模式下工作,而不是调试

windows - Windows 上的 Tomcat 日志传送到 logstash

c - 使用 C 将输入写入控制台

c++ - 插入 std::map 的最佳方式

C++ 继承和多态未知输出

windows - 将大文件合并为一个巨大的文件

c++ - 将窗口放在前面 -> raise()、show()、activateWindow() 不起作用

c++ - 在 C++ Builder 中获取正在执行的进程/线程的 ID

c++ - GDIplus闪烁