处理器组
64 位版本的 Windows 7 和 Windows Server 2008 R2 及更高版本的 Windows在单个计算机上支持超过 64 个逻辑处理器。 此功能在 32 位版本的 Windows 上不可用。
具有多个物理处理器的系统或具有多个内核的物理处理器的系统为操作系统提供多个逻辑处理器。 从操作系统、应用程序或驱动程序的角度来看, 逻辑处理器 是一个逻辑计算引擎。 核心是一个处理器单元,可以包含一个或多个逻辑处理器。 物理处理器可以包含一个或多个核心。 物理处理器与处理器包、套接字或 CPU 相同。
对具有 64 个以上逻辑处理器的系统的支持基于 处理器组的概念,这是一组最多 64 个逻辑处理器的静态集,被视为单个计划实体。 处理器组从 0 开始编号。 少于 64 个逻辑处理器的系统始终具有单个组 0。
Windows Server 2008、Windows Vista、Windows Server 2003 和 Windows XP:不支持处理器组。
当系统启动时,操作系统将创建处理器组并将逻辑处理器分配给组。 如果系统能够热添加处理器,操作系统允许在系统运行时到达的处理器组空间。 操作系统可最大程度地减少系统中的组数。 例如,具有 128 个逻辑处理器的系统在每个组中具有 64 个处理器组,而不是每个组中具有 32 个逻辑处理器的四个组。
为了提高性能,操作系统在将逻辑处理器分配到组时考虑物理区域。 如果可能,核心中的所有逻辑处理器以及物理处理器中的所有核心都分配给同一组。 物理上靠近彼此的物理处理器将分配到同一组。 NUMA 节点分配给单个组,除非节点的容量超过最大组大小。 有关详细信息,请参阅 NUMA 支持。
在具有 64 个或更少处理器的系统上,现有应用程序无需修改即可正常运行。 不调用任何使用处理器关联掩码或处理器编号的函数的应用程序将在所有系统上正常运行,而不管处理器数如何。 若要在具有 64 个以上的逻辑处理器的系统上正常运行,以下类型的应用程序可能需要修改:
- 必须修改对整个系统管理、维护或显示每个处理器信息的应用程序,以支持 64 个以上的逻辑处理器。 此类应用程序的一个示例是Windows任务管理器,它显示系统中每个处理器的工作负荷。
- 必须修改性能至关重要且可有效缩放超过 64 个逻辑处理器的应用程序,以便在此类系统上运行。 例如,数据库应用程序可能会受益于修改。
- 如果应用程序使用具有每个处理器数据结构的 DLL,并且 DLL 尚未修改以支持超过 64 个逻辑处理器,则调用 DLL 导出函数的应用程序中的所有线程都必须分配给同一组。
默认情况下,应用程序受限于单个组,该组应为典型应用程序提供充足的处理功能。 操作系统最初以轮循机制的方式将每个进程分配给系统中各组。 进程开始分配给一个组的执行。 进程的第一个线程最初在为其分配进程的组中运行。 每个新创建的线程都分配给与创建线程的同一组。
需要使用多个组的应用程序,以便它可以在 64 个以上的处理器上运行,必须显式确定运行其线程的位置,并负责将线程的处理器相关性设置为所需的组。 INHERIT_PARENT_AFFINITY标志可用于指定父进程 (与从中生成新进程的相关性的当前进程) 不同。 如果进程在单个组中运行,则可以使用 GetProcessAffinityMask 和 SetProcessAffinityMask 读取和修改其相关性,同时保留在同一组中:如果修改了进程相关性,新相关性将应用于其线程。
可以使用具有 CreateRemoteThreadEx 函数的 PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY 扩展属性在创建时指定线程的相关性。 创建线程后,可以通过调用 SetThreadAffinityMask 或 SetThreadGroupAffinity 来更改其相关性。 如果将线程分配给与进程不同的组,则进程相关性会更新为包含线程的相关性,并且进程将成为多组进程。 必须对单个线程进行进一步的相关性更改;不能使用 SetProcessAffinityMask 修改多组进程的相关性。 GetProcessGroupAffinity 函数检索为其分配进程及其线程的组集。
若要指定与作业对象关联的所有进程的相关性,请将 SetInformationJobObject 函数与 JobObjectGroupInformation 或 JobObjectGroupInformationEx 信息类一起使用。
逻辑处理器由其组号及其相对于组的处理器编号标识。 这由 PROCESSOR_NUMBER 结构表示。 旧函数使用的数字处理器编号是相对于组的。
有关操作系统体系结构更改的讨论,以支持超过 64 个处理器,请参阅白皮书 支持超过 64 个处理器的系统。
有关支持处理器组的新函数和结构的列表,请参阅 进程和线程中的新增功能。
从 Windows 11 和 Windows Server 2022 开始的行为
注意
从 Windows 11 和 Windows Server 2022 开始,默认情况下应用程序不再受到单个处理器组的约束。 相反,进程及其线程具有处理器相关性,默认情况下跨系统中所有处理器,在具有 64 个以上的处理器的计算机上跨多个组。
为了使应用程序自动利用具有 64 个以上的处理器的计算机中的所有处理器,从 Windows 11 开始,Windows Server 2022,OS 已更改,使进程及其线程跨系统中的所有处理器跨所有处理器组默认跨所有处理器组。 这意味着应用程序不再需要显式设置其线程的相关性才能访问多个处理器组。
出于兼容性原因,OS 对进程和线程都使用新的 主组 概念。 每个进程在创建时都会分配一个主组,默认情况下,其所有线程的主组都是相同的。 每个线程的理想处理器都位于线程的主组中,因此线程将优先安排到主组中的处理器,但能够计划到任何其他组中的处理器。 不识别组或对单个组进行操作的关联 API 隐式使用主组作为进程/线程处理器组;有关新行为的详细信息,请查看以下内容的“备注”部分:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
应用程序可以使用 CPU 集 有效地管理进程或线程对多个处理器组的相关性。
相关主题