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