Hinweis
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, sich anzumelden oder das Verzeichnis zu wechseln.
Für den Zugriff auf diese Seite ist eine Autorisierung erforderlich. Sie können versuchen, das Verzeichnis zu wechseln.
Die 64-Bit-Versionen von Windows 7 und Windows Server 2008 R2 sowie spätere Windows-Versionen 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 zur Verfügung. Ein logischer Prozessor ist eine logische Recheneinheit 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 im laufenden Betrieb hinzuzufügen, reserviert 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 Lokalität 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, pflegen 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 skalieren 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 Verarbeitungskapazität für die typische Anwendung bereitstellen sollte. Das Betriebssystem weist zunächst jedem Prozess genau einer Gruppe reihum auf die Gruppen im System zu. Ein Prozess beginnt seine Ausführung und ist einer Gruppe zugewiesen. 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 dem Thread, von dem er erstellt wurde.
Eine Anwendung, die die Verwendung mehrerer Gruppen erfordert, damit sie auf mehr als 64 Prozessoren ausgeführt werden kann, muss explizit bestimmen, auf welchen Prozessorgruppen ihre 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 mit GetProcessAffinityMask auslesen und mit SetProcessAffinityMask ändern, während er in derselben Gruppe verbleibt; 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 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 mit SetProcessAffinityMask geändert werden. Die GetProcessGroupAffinity-Funktion ruft die Menge der Gruppen ab, denen ein Prozess und seine Threads zugewiesen sind.
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ützung von Systemen mit mehr als 64 Prozessoren.
Eine Liste der neuen Funktionen und Strukturen, die Prozessorgruppen unterstützen, finden Sie unter Neuerungen bei 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, wurde das Betriebssystem ab Windows 11 und Windows Server 2022 so geändert, dass sich Prozesse und ihre Threads standardmäßig über alle Prozessoren im System und über alle Prozessorgruppen hinweg erstrecken. 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 haben alle seine Threads dieselbe primäre Gruppe. Der ideale Prozessor jedes Threads befindet sich in der primären Gruppe des Threads, sodass Threads bevorzugt Prozessoren in ihrer primären Gruppe zugewiesen werden, aber sie können Prozessoren in jeder anderen Gruppe zugewiesen werden. Affinitäts-APIs, die nicht gruppenfähig sind oder mit 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:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
Anwendungen können CPU Sets verwenden, um die Affinität eines Prozesses oder Threads über mehrere Prozessorgruppen effektiv zu verwalten.
Verwandte Themen