處理器群組
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 會隱含地使用主要群組作為進程/線程處理器群組;如需有關新行為的詳細資訊,請參閱下列的小節:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
應用程式可以使用 CPU 集合 ,有效地管理進程或線程對多個處理器群組的親和性。
相關主題