Freigeben über


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 Systemen mit physischen Prozessoren, die über mehrere Kerne verfügen, bieten das Betriebssystem mit mehreren logischen Prozessoren. Ein logischer Prozessor ist ein logisches Computermodul aus der Perspektive des Betriebssystems, der Anwendung oder des Treibers. 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 verfügen immer über eine einzige Gruppe, 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 heiß hinzuzufügen, ermöglicht das Betriebssystem Platz in Gruppen für Prozessoren, die während der Ausführung des Systems ankommen können. 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 haben, nicht vier Gruppen mit 32 logischen Prozessoren in jeder Gruppe.

Um eine bessere Leistung zu erzielen, berücksichtigt das Betriebssystem physische Gebietsschemas beim Zuweisen logischer Prozessoren zu Gruppen. Alle logischen Prozessoren in einem Kern und alle Kerne in einem physischen Prozessor werden der gleichen Gruppe zugewiesen, sofern möglich. 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 Support.

Auf 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. Um ordnungsgemäß auf Systemen mit mehr als 64 logischen Prozessoren zu arbeiten, können die folgenden Arten von Anwendungen Änderungen erfordern:

  • Anwendungen, die Prozessorinformationen für das gesamte System verwalten, 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 Windows-Task-Manager, der die Arbeitsauslastung der einzelnen Prozessor im System anzeigt.
  • Anwendungen, für die die Leistung kritisch 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 z. B. von Änderungen profitieren.
  • Wenn eine Anwendung eine DLL mit Datenstrukturen pro Prozessor 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 jedem Prozess eine einzelne Gruppe auf Roundrobin-Weise über die Gruppen im System zu. 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. Jedem neu erstellten Thread wird dieselbe 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, und ist 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 von dem aktuellen Prozess unterscheiden kann) anzugeben, von dem 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 GetProcessAffinityMask- lesen und ändern und SetProcessAffinityMask-, während er in derselben Gruppe verbleibt; wenn die Prozessaffinität geändert wird, wird die neue Affinität auf ihre Threads angewendet.

Die Affinität eines Threads kann beim Erstellen mithilfe des PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY erweiterten Attributs mit der CreateRemoteThreadEx--Funktion angegeben werden. Nachdem der Thread erstellt wurde, kann seine Affinität durch Aufrufen von SetThreadAffinityMask oder SetThreadGroupAffinitygeändert werden. Wenn einem Thread eine andere Gruppe als dem Prozess zugewiesen ist, wird die Affinität des Prozesses aktualisiert, um die Affinität des Threads einzuschließen, und der Prozess wird zu einem Mehrgruppenprozess. Weitere Affinitätsänderungen müssen für einzelne Threads vorgenommen werden; Die Affinität eines Mehrgruppenprozesses kann nicht mithilfe SetProcessAffinityMask-geändert werden. Die GetProcessGroupAffinity--Funktion ruft die Gruppe von 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 JobObjectGroupInformation oder JobObjectGroupInformationEx Informationsklasse.

Ein logischer Prozessor wird durch seine Gruppennummer und seine gruppenrelative Prozessornummer identifiziert. Dies wird durch eine PROCESSOR_NUMBER Struktur dargestellt. Numerische Prozessornummern, die von älteren 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ützende Systeme mit mehr als 64 Prozessoren.

Eine Liste der neuen Funktionen und Strukturen, die Prozessorgruppen unterstützen, finden Sie unter Neuigkeiten in Prozessen und Threads.

Verhalten ab Windows 11 und Windows Server 2022

Anmerkung

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, über mehrere Gruppen auf Computern mit mehr als 64 Prozessoren.

Damit Anwendungen automatisch alle Prozessoren auf einem Computer mit mehr als 64 Prozessoren nutzen können, hat sich das Betriebssystem ab Windows 11 und Windows Server 2022 geändert, um Prozesse und deren Threads über alle Prozessoren im System hinweg, standardmäßig über alle Prozessorgruppen hinweg, zu nutzen. 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 Primary Group Konzept für Prozesse und Threads. Jedem Prozess wird eine primäre Gruppe beim Erstellen 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 nicht gruppenfähig sind oder für eine einzelne Gruppe ausgeführt werden, verwenden implizit die primäre Gruppe als Prozess-/Threadprozessorgruppe; weitere Informationen zu den neuen Verhaltensweisen finden Sie in den Abschnitten "Hinweise" für Folgendes:

Anwendungen können CPU-Sätze verwenden, um die Affinität eines Prozesses oder Threads über mehrere Prozessorgruppen effektiv zu verwalten.

mehrere Prozessoren

NUMA Support-