處理器群組

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 會針對進程和線程使用新的 主要群組 概念。 每個進程都會在建立時指派一個主要群組,而且根據預設,其所有線程的主要群組都相同。 每個線程的理想處理器都位於線程的主要群組中,因此線程會優先排程到主要群組上的處理器,但可以排程到任何其他群組上的處理器。 非群組感知或在單一群組上運作的親和性 API 會隱含地使用主要群組作為進程/線程處理器群組;如需有關新行為的詳細資訊,請參閱下列的小節:

應用程式可以使用 CPU Sets,以有效地管理進程或執行緒對多個處理器群組的親和性。

多個處理器

NUMA 支援