处理器组

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 读取和修改其处理器相关性,同时保留在同一组中;如果修改了进程处理器相关性,则新的处理器相关性将应用于其线程。

可以在创建时使用 PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY 扩展属性和 CreateRemoteThreadEx 函数指定线程的亲和性。 创建线程后,可以通过调用 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 对进程和线程使用新的 主组 概念。 每个进程在创建时都会分配一个主组,默认情况下,其所有线程的主组都是相同的。 每个线程的理想处理器都位于线程的主组中,因此线程将优先调度到其主组中的处理器,但它们也能够调度到任何其他组中的处理器。 不支持组感知或对单个组进行操作的关联 API 隐式使用主组作为进程/线程处理器组;有关新行为的详细信息,请查看以下内容的“备注”部分:

应用程序可以使用 CPU 集 有效地管理进程或线程在多个处理器组上的亲和性。

多个处理器

NUMA 支持