处理器组
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 集来有效地管理进程或线程对多个处理器组的相关性。
相关主题