Prozessorgruppen
Die 64-Bit-Versionen von Windows 7 und Windows Server 2008 R2 und höher unterstützen mehr als 64 logische Prozessoren auf einem einzelnen Computer. Diese Funktionalität ist in 32-Bit-Versionen von Windows nicht verfügbar.
Systeme mit mehr als einem physischen Prozessor oder Systeme mit physischen Prozessoren, die über mehrere Kerne verfügen, stellen dem Betriebssystem mehrere logische Prozessoren bereit. Ein logischer Prozessor ist aus der Perspektive des Betriebssystems, der Anwendung oder des Treibers eine logische Computer-Engine. Ein Kern ist eine Prozessoreinheit, die aus einem oder mehreren logischen Prozessoren bestehen kann. Ein physischer Prozessor kann aus einem oder mehreren Kernen bestehen. Ein physischer Prozessor ist identisch mit einem Prozessorpaket, einem Socket oder einer CPU.
Die Unterstützung für Systeme mit mehr als 64 logischen Prozessoren basiert auf dem Konzept einer Prozessorgruppe, bei der es sich um eine statische Gruppe von bis zu 64 logischen Prozessoren handelt, die als einzelne Planungsentität behandelt werden. Prozessorgruppen werden beginnend mit 0 nummeriert. Systeme mit weniger als 64 logischen Prozessoren stellen immer eine einzige Gruppe dar (Gruppe 0).
Windows Server 2008, Windows Vista, Windows Server 2003 und Windows XP: Prozessorgruppen werden nicht unterstützt.
Wenn das System gestartet wird, erstellt das Betriebssystem Prozessorgruppen und weist den Gruppen logische Prozessoren zu. Wenn das System in der Lage ist, Prozessoren im Rahmen von Hot-Adding-Vorgängen hinzuzufügen, stellt das Betriebssystem Platz in Gruppen für Prozessoren bereit, die während der Ausführung des Systems hinzugefügt werden. Das Betriebssystem minimiert die Anzahl von Gruppen in einem System. Ein System mit 128 logischen Prozessoren würde beispielsweise zwei Prozessorgruppen mit 64 Prozessoren in jeder Gruppe und nicht vier Gruppen mit 32 logischen Prozessoren in jeder Gruppe aufweisen.
Um eine bessere Leistung zu erzielen, berücksichtigt das Betriebssystem die physische Lokalität beim Zuweisen logischer Prozessoren zu Gruppen. Alle logischen Prozessoren in einem Kern und alle Kerne in einem physischen Prozessor werden nach Möglichkeit derselben Gruppe zugewiesen. Physische Prozessoren, die physisch nah aneinander liegen, werden derselben Gruppe zugewiesen. Ein NUMA-Knoten wird einer einzelnen Gruppe zugewiesen, es sei denn, die Kapazität des Knotens überschreitet die maximale Gruppengröße. Weitere Informationen finden Sie unter NUMA-Unterstützung.
Bei Systemen mit 64 oder weniger Prozessoren funktionieren vorhandene Anwendungen ohne Änderung ordnungsgemäß. Anwendungen, die keine Funktionen aufrufen, die Prozessoraffinitätsmasken oder Prozessornummern verwenden, funktionieren unabhängig von der Anzahl der Prozessoren ordnungsgemäß auf allen Systemen. Möglicherweise erfordern die folgenden Anwendungen eine Änderung, um auf Systemen mit mehr als 64 logischen Prozessoren ordnungsgemäß zu funktionieren:
- Anwendungen, die prozessorbasierte Informationen für das gesamte System verwalten oder anzeigen, müssen geändert werden, um mehr als 64 logische Prozessoren zu unterstützen. Ein Beispiel für eine solche Anwendung ist der Task-Manager, der die Arbeitsauslastung der einzelnen Prozessoren im System anzeigt.
- Anwendungen, für die die Leistung von essenzieller Bedeutung ist und die effizient über 64 logische Prozessoren hinaus skaliert werden können, müssen so geändert werden, dass sie auf solchen Systemen ausgeführt werden können. Datenbankanwendungen können beispielsweise von Änderungen profitieren.
- Wenn eine Anwendung eine DLL mit prozessorbasierten Datenstrukturen verwendet und die DLL nicht geändert wurde, um mehr als 64 logische Prozessoren zu unterstützen, müssen alle Threads in der Anwendung, die von der DLL exportierte Funktionen aufrufen, derselben Gruppe zugewiesen werden.
Standardmäßig ist eine Anwendung auf eine einzelne Gruppe beschränkt, die ausreichend Verarbeitungsfunktionen für die typische Anwendung bereitstellen sollte. Das Betriebssystem weist zunächst jeden Prozess einer einzelnen Gruppe zu (gemäß Roundrobin-Methode für alle Gruppen im System). Ein Prozess beginnt mit der Ausführung, die einer Gruppe zugewiesen ist. Der erste Thread eines Prozesses wird zunächst in der Gruppe ausgeführt, der der Prozess zugewiesen ist. Jeder neu erstellte Thread wird derselben Gruppe zugewiesen wie der Thread, der ihn erstellt hat.
Eine Anwendung, die die Verwendung mehrerer Gruppen erfordert, damit sie auf mehr als 64 Prozessoren ausgeführt werden kann, muss explizit bestimmen, wo die Threads ausgeführt werden sollen. Zudem ist sie dafür verantwortlich, die Prozessoraffinität der Threads auf die gewünschten Gruppen festzulegen. Das INHERIT_PARENT_AFFINITY-Flag kann verwendet werden, um einen übergeordneten Prozess (der sich vom aktuellen Prozess unterscheiden kann) anzugeben, über den die Affinität für einen neuen Prozess generiert werden soll. Wenn der Prozess in einer einzelnen Gruppe ausgeführt wird, kann er seine Affinität mithilfe von GetProcessAffinityMask und SetProcessAffinityMask lesen und ändern und in derselben Gruppe verbleiben. Wenn die Prozessaffinität geändert wird, wird die neue Affinität auf die Threads angewendet.
Die Affinität eines Threads kann bei der Erstellung mithilfe des erweiterten PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY-Attributs mit der CreateRemoteThreadEx-Funktion angegeben werden. Nachdem der Thread erstellt wurde, kann seine Affinität durch Aufrufen von SetThreadAffinityMask oder SetThreadGroupAffinity geändert werden. Wenn ein Thread einer anderen Gruppe zugewiesen wird als der Prozess, wird die Affinität des Prozesses aktualisiert, um die Affinität des Threads einzuschließen. Der Prozess wird dann zu einem Prozess mit mehreren Gruppen. Weitere Affinitätsänderungen müssen für einzelne Threads vorgenommen werden. Die Affinität eines Prozesses mit mehreren Gruppen kann nicht mithilfe von SetProcessAffinityMask geändert werden. Die GetProcessGroupAffinity-Funktion ruft die Gruppen ab, denen ein Prozess und seine Threads zugewiesen werden.
Um die Affinität für alle Prozesse anzugeben, die einem Auftragsobjekt zugeordnet sind, verwenden Sie die SetInformationJobObject-Funktion mit der Informationsklasse JobObjectGroupInformation oder JobObjectGroupInformationEx.
Ein logischer Prozessor wird durch seine Gruppennummer und seine gruppenrelative Prozessornummer identifiziert. Dies wird durch eine PROCESSOR_NUMBER-Struktur dargestellt. Numerische Prozessornummern, die von Legacy-Funktionen verwendet werden, sind gruppenrelativ.
Eine Erläuterung der Änderungen der Betriebssystemarchitektur zur Unterstützung von mehr als 64 Prozessoren finden Sie im Whitepaper Unterstützung für Systeme mit mehr als 64 Prozessoren.
Eine Liste der neuen Funktionen und Strukturen, die Prozessorgruppen unterstützen, finden Sie unter Neuerungen in Prozessen und Threads.
Verhalten ab Windows 11 und Windows Server 2022
Hinweis
Ab Windows 11 und Windows Server 2022 ist es nicht mehr der Fall, dass Anwendungen standardmäßig auf eine einzelne Prozessorgruppe beschränkt sind. Stattdessen verfügen Prozesse und ihre Threads über Prozessoraffinitäten, die standardmäßig alle Prozessoren im System umfassen (gruppenübergreifend auf Computern mit mehr als 64 Prozessoren).
Damit Anwendungen automatisch alle Prozessoren auf einem Computer mit mehr als 64 Prozessoren nutzen können, wurde das Betriebssystem ab Windows 11 und Windows Server 2022 so geändert, dass Prozesse und ihre Threads standardmäßig prozessorgruppenübergreifend alle Prozessoren im System abdecken. Dies bedeutet, dass Anwendungen die Affinität ihrer Threads nicht mehr explizit festlegen müssen, um auf mehrere Prozessorgruppen zuzugreifen.
Aus Kompatibilitätsgründen verwendet das Betriebssystem ein neues Konzept für primäre Gruppen für Prozesse und Threads. Jedem Prozess wird beim Erstellen eine primäre Gruppe zugewiesen, und standardmäßig ist die primäre Gruppe aller Threads identisch. Der ideale Prozessor jedes Threads befindet sich in der primären Gruppe des Threads, sodass Threads bevorzugt für Prozessoren in ihrer primären Gruppe geplant werden, aber sie können für Prozessoren in jeder anderen Gruppe geplant werden. Affinitäts-APIs, die keine Gruppen berücksichtigen oder für eine einzelne Gruppe ausgeführt werden, verwenden implizit die primäre Gruppe als Prozess- bzw. Threadprozessorgruppe. Weitere Informationen zu den neuen Verhaltensweisen finden Sie in den folgenden Artikeln im jeweiligen Abschnitt „Hinweise“:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
Anwendungen können CPU-Sätze verwenden, um die Affinität eines Prozesses oder Threads effektiv für mehrere Prozessorgruppen zu verwalten.
Zugehörige Themen