Prozessorgruppen
Die 64-Bit-Versionen von Windows 7 und Windows Server 2008 R2 und höher von Windows unterstützen mehr als 64 logische Prozessoren auf einem einzelnen Computer. Diese Funktionalität ist in 32-Bit-Versionen von Windows.
Systeme mit mehr als einem physischen Prozessor oder Systeme mit physischen Prozessoren mit mehreren Kernen stellen dem Betriebssystem mehrere logische Prozessoren zur Verfügung. Ein logischer Prozessor ist eine logische Computing-Engine 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 einen statischen Satz 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 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, Hot-Adding-Prozessoren zu verwenden, lässt das Betriebssystem Speicherplatz in Gruppen für Prozessoren zu, die während der Ausführung des Systems eintreffen können. Das Betriebssystem minimiert die Anzahl der Gruppen in einem System. Beispielsweise würde ein System mit 128 logischen Prozessoren zwei Prozessorgruppen mit 64 Prozessoren in jeder Gruppe und nicht vier Gruppen mit 32 logischen Prozessoren in jeder Gruppe haben.
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 beieinander 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 Änderungen ordnungsgemäß. Anwendungen, die keine Funktionen aufrufen, die Prozessoraffinitätsmasken oder Prozessornummern verwenden, funktionieren auf allen Systemen ordnungsgemäß, unabhängig von der Anzahl der Prozessoren. Um ordnungsgemäß auf Systemen mit mehr als 64 logischen Prozessoren zu arbeiten, müssen die folgenden Arten von Anwendungen möglicherweise geändert werden:
- Anwendungen, die Prozessorinformationen für das gesamte System verwalten, verwalten oder anzeigen, müssen so geändert werden, dass sie mehr als 64 logische Prozessoren unterstützen. Ein Beispiel für eine solche Anwendung ist Windows Task-Manager, die die Workload jedes Prozessors im System anzeigt.
- Anwendungen, deren Leistung entscheidend ist und die effizient über 64 logische Prozessoren hinaus skaliert werden können, müssen für die Ausführung auf solchen Systemen geändert werden. Beispielsweise können Datenbankanwendungen von Änderungen profitieren.
- Wenn eine Anwendung eine DLL mit Prozessordatenstrukturen 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 umfangreiche Verarbeitungsfunktionen für die typische Anwendung bereitstellen sollte. Das Betriebssystem weist zunächst jeden Prozess einer einzelnen Gruppe in roundrobin-Weise über die Gruppen im System hinweg zu. Ein Prozess beginnt seine Ausführung, die einer Gruppe zugewiesen ist. Der erste Thread eines Prozesses wird anfänglich 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 ihre Threads ausgeführt werden sollen, und ist dafür verantwortlich, die Prozessoraffinitäten der Threads auf die gewünschten Gruppen festzulegen. Das FLAG INHERIT PARENT _ _ AFFINITY kann verwendet werden, um einen übergeordneten Prozess anzugeben (der sich vom aktuellen Prozess unterscheiden kann), aus 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 mit GetProcessAffinityMask und SetProcessAffinityMask lesen und ändern, während er in derselben Gruppe verbleibt. 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 Attributs PROC _ THREAD ATTRIBUTE GROUP _ _ _ AFFINITY 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 als dem Prozess zugewiesen ist, wird die Affinität des Prozesses so aktualisiert, dass er die Affinität des Threads enthält, und der Prozess wird 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 mit setProcessAffinityMask geändert werden. Die GetProcessGroupAffinity-Funktion ruft den Satz von Gruppen ab, denen ein Prozess und seine Threads zugewiesen sind.
Um affinity 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 anhand seiner Gruppennummer und seiner gruppen relativen Prozessornummer identifiziert. Dies wird durch eine PROCESSOR _ NUMBER-Struktur dargestellt. Numerische Prozessornummern, die von Legacyfunktionen verwendet werden, sind gruppen relativ.
Eine Erörterung der Änderungen an der Betriebssystemarchitektur zur Unterstützung von mehr als 64 Prozessoren finden Sie im Whitepaper Supporting Systems That Have More Than 64 Processors.
Eine Liste der neuen Funktionen und Strukturen, die Prozessorgruppen unterstützen, finden Sie unter Neues in Prozessen und Threads.
Verhalten ab Windows 11 Windows Server 2022
Hinweis
Ab Windows 11 und Windows Server 2022 ist es nicht mehr so, 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 über mehrere Gruppen auf Computern mit mehr als 64 Prozessoren umfassen.
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 so geändert, dass prozesse und ihre Threads standardmäßig alle Prozessoren im System über alle Prozessorgruppen hinweg umfassen. Dies bedeutet, dass Anwendungen die Affinitäten ihrer Threads nicht mehr explizit festlegen müssen, um auf mehrere Prozessorgruppen zugreifen zu können.
Aus Kompatibilitätsgründen verwendet das Betriebssystem ein neues Konzept der primären Gruppe für Prozesse und Threads. Jedem Prozess wird bei der Erstellung 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 nach möglichkeit 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 unterstützen 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:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
Anwendungen können CPU-Sätze verwenden, um die Affinität eines Prozesses oder Threads über mehrere Prozessorgruppen effektiv zu verwalten.