處理器群組
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 集合 ,有效地管理進程或執行緒對多個處理器群組的親和性。
相關主題
意見反應
提交並檢視相關的意見反應