本文有助于解决环境变量在具有 64 个以上逻辑处理器的系统上可能显示错误值的问题 %NUMBER_OF_PROCESSORS% 。
你有一个具有 64 位以上的逻辑处理器的 64 位 Windows 系统。 检查 %NUMBER_OF_PROCESSORS% 环境变量时,你会发现该值不正确,并且小于系统中的处理器总数。 例如,具有 72 个逻辑处理器的系统有两个处理器组,每个组包含 36 个逻辑处理器。 该值 %NUMBER_OF_PROCESSORS% 为 36,但预期值为 72。
支持大于 64 个逻辑处理器的系统
逻辑处理器是从操作系统、应用程序或驱动程序的角度来看的逻辑计算引擎。 基于创建处理器组,在 Windows 7 中添加了对超过 64 个逻辑处理器的系统的支持。
处理器组是一组最多 64 个逻辑处理器,由操作系统视为单个计划实体,默认情况下,每个进程仅分配给一个处理器组。
仅计算当前处理器组
环境变量 %NUMBER_OF_PROCESSORS% 反映进程分配的处理器组中的处理器数,并且继承自 Windows 会话管理器(smss.exe)。 在 Windows 11 和 Windows Server 2022 之前, smss.exe 无法识别处理器组。 默认计划程序行为是将应用程序分配到单个处理器组。 在这种情况下,仅计算当前处理器组。
只有系统进程在系统启动时分配了一个多组关联。 若要使用系统中的完整处理器集,所有其他进程都需要将线程分配到其他组。
如果应用程序需要使用多个组在 64 个以上的处理器上运行,则需要确定运行其线程的位置。 应用程序负责设置所需组的线程相关性。
将系统更新到 Windows 11 或 Windows Server 2022
可以将系统更新到 Windows 11 或 Windows Server 2022。 从 Windows 11 和 Windows Server 2022 开始,在处理器超过 64 的计算机上,进程及其线程默认跨多个组跨系统中的所有处理器。 此外,从 Windows 11 版本 22H2 开始, %NUMBER_OF_PROCESSORS% 环境变量反映系统上的处理器总数,即使它们分布在多个处理器组中也是如此。
将应用程序线程相关性设置为所需的组
如果操作系统在 Windows 11 或 Windows Server 2022 之前,则可以将应用程序线程关联设置为所需的组。
可以通过将PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY扩展属性与 CreateRemoteThreadEx函数一起使用来指定线程的关联。 创建线程后,可以通过调用 SetThreadAffinityMask 或 SetThreadGroupAffinity 函数来更改其相关性。