Prozessorgruppen

Die 64-Bit-Versionen von Windows 7 und Windows Server 2008 R2 und höheren Versionen von Windows 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 mehrere Kerne haben, bieten das Betriebssystem mit mehreren logischen Prozessoren. Ein logischer Prozessor ist ein logisches Computing-Modul aus der Perspektive des Betriebssystems, der Anwendung oder des Treibers. Ein Kern ist eine Prozessoreinheit, die aus einer oder mehreren logischen Prozessoren bestehen kann. Ein physischer Prozessor kann aus einem oder mehreren Kernen bestehen. Ein physischer Prozessor entspricht 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, die eine statische Einrichtung von bis zu 64 logischen Prozessoren darstellt, die als einzelne Planungsentität behandelt werden. Prozessorgruppen werden ab 0 nummeriert. Systeme mit weniger als 64 logischen Prozessoren verfügen immer über eine einzelne 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 mit hot-addieren zu können, ermöglicht das Betriebssystem Platz in Gruppen für Prozessoren, die während der Ausführung des Systems auftreten können. Das Betriebssystem minimiert die Anzahl von Gruppen in einem System. Ein System mit 128 logischen Prozessoren hätte beispielsweise zwei Prozessorgruppen mit 64 Prozessoren in jeder Gruppe, nicht vier Gruppen mit 32 logischen Prozessoren in jeder Gruppe.

Für eine bessere Leistung berücksichtigt das Betriebssystem beim Zuweisen logischer Prozessoren zu Gruppen physische Gebietsschemas. Alle logischen Prozessoren in einem Kern und alle Kerne in einem physischen Prozessor werden ggf. 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.

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, erfordern die folgenden Arten von Anwendungen möglicherweise Änderungen:

  • Anwendungen, die Informationen pro Prozessor für das gesamte System verwalten, 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 Windows Task-Manager, der die Arbeitsauslastung jedes Prozessors im System anzeigt.
  • Anwendungen, für die die Leistung wichtig ist und die effizient über 64 logische Prozessoren hinaus skaliert werden können, müssen geändert werden, um auf solchen Systemen ausgeführt zu werden. Datenbankanwendungen können beispielsweise von Änderungen profitieren.
  • Wenn eine Anwendung eine DLL mit Datenstrukturen pro Prozessor verwendet, und die DLL wurde nicht geändert, 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 round-robin-Weise über die Gruppen im System zu. Ein Prozess beginnt seine 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 wie der Thread zugewiesen, 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 seine Threads ausgeführt werden sollen und für das Festlegen der Prozessoraffinitäten der Threads auf die gewünschten Gruppen verantwortlich ist. Das INHERIT_PARENT_AFFINITY-Flag kann verwendet werden, um einen übergeordneten Prozess anzugeben (der sich vom aktuellen Prozess unterscheiden kann), von dem aus die Affinität für einen neuen Prozess generiert werden soll. Wenn der Prozess in einer einzigen Gruppe ausgeführt wird, kann er seine Affinität mithilfe von GetProcessAffinityMask und SetProcessAffinityMask lesen und ändern und gleichzeitig in derselben Gruppe verbleiben; Wenn die Prozessaffinität geändert wird, wird die neue Affinität auf seine Threads angewendet.

Die Affinität eines Threads kann beim Erstellen mithilfe des PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY erweiterten Attributs mit der Funktion CreateRemoteThreadEx angegeben werden. Nachdem der Thread erstellt wurde, kann seine Affinität durch Aufrufen von SetThreadAffinityMask oder SetThreadGroupAffinity geä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 von SetProcessAffinityMask geändert werden. Die GetProcessGroupAffinity-Funktion ruft die Gruppe von Gruppen ab, denen ein Prozess und seine Threads zugewiesen werden.

Verwenden Sie zum Angeben der Affinität für alle Prozesse, die einem Auftragsobjekt zugeordnet sind, 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 Legacyfunktionen verwendet werden, sind gruppenrelativ.

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

Damit Anwendungen alle Prozessoren auf einem Computer mit mehr als 64 Prozessoren automatisch nutzen können, beginnend mit Windows 11 und Windows Server 2022 hat sich das Betriebssystem so geändert, dass Prozesse und ihre Threads alle Prozessoren im System über alle Prozessorgruppen hinweg umfassen. 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 sowohl für Prozesse als auch für Threads. Jedem Prozess wird eine primäre Gruppe zur Erstellung 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 prozessoren in jeder anderen Gruppe planen. Affinitäts-APIs, die nicht gruppieren oder auf einer einzelnen Gruppe arbeiten, 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-Sets verwenden, um die Affinität eines Prozesses oder Threads effektiv über mehrere Prozessorgruppen zu verwalten.

Mehrere Prozessoren

NUMA-Unterstützung