Processorgroepen
De 64-bits versies van Windows 7 en Windows Server 2008 R2 en latere versies van Windows ondersteunen meer dan 64 logische processors op één computer. Deze functionaliteit is niet beschikbaar in 32-bits versies van Windows.
Systemen met meer dan één fysieke processor of systemen met fysieke processors met meerdere kernen bieden het besturingssysteem meerdere logische processors. Een logische processor is één logische computerengine vanuit het perspectief van het besturingssysteem, de toepassing of het stuurprogramma. Een kern is één processoreenheid, die kan bestaan uit een of meer logische processors. Een fysieke processor kan bestaan uit een of meer kernen. Een fysieke processor is hetzelfde als een processorpakket, een socket of een CPU.
Ondersteuning voor systemen met meer dan 64 logische processors is gebaseerd op het concept van een processorgroep, een statische set van maximaal 64 logische processors die als één planningsentiteit worden behandeld. Processorgroepen worden genummerd vanaf 0. Systemen met minder dan 64 logische processors hebben altijd één groep, Groep 0.
Windows Server 2008, Windows Vista, Windows Server 2003 en Windows XP: Processor-groepen worden niet ondersteund.
Wanneer het systeem wordt gestart, maakt het besturingssysteem processorgroepen en wijst logische processors toe aan de groepen. Als het systeem geschikt is voor hot-adding processors, staat het besturingssysteem ruimte toe in groepen voor processors die kunnen binnenkomen terwijl het systeem wordt uitgevoerd. Het besturingssysteem minimaliseert het aantal groepen in een systeem. Een systeem met 128 logische processors heeft bijvoorbeeld twee processorgroepen met 64 processors in elke groep, niet vier groepen met 32 logische processors in elke groep.
Voor betere prestaties houdt het besturingssysteem rekening met fysieke lokaliteit bij het toewijzen van logische processors aan groepen. Alle logische processors in een kern en alle kernen in een fysieke processor worden, indien mogelijk, toegewezen aan dezelfde groep. Fysieke processors die zich fysiek dicht bij elkaar bevinden, worden toegewezen aan dezelfde groep. Een NUMA-knooppunt wordt toegewezen aan één groep, tenzij de capaciteit van het knooppunt de maximale groepsgrootte overschrijdt. Zie NUMA-ondersteuningvoor meer informatie.
Op systemen met 64 of minder processors werken bestaande toepassingen correct zonder aanpassingen. Toepassingen die geen functies aanroepen die gebruikmaken van processoraffiniteitsmaskers of processornummers, werken correct op alle systemen, ongeacht het aantal processors. Om correct te kunnen werken op systemen met meer dan 64 logische processors, kunnen de volgende soorten toepassingen moeten worden gewijzigd:
- Toepassingen die informatie per processor voor het hele systeem beheren, onderhouden of weergeven, moeten worden gewijzigd ter ondersteuning van meer dan 64 logische processors. Een voorbeeld van een dergelijke toepassing is Windows Task Manager, waarin de werkbelasting van elke processor in het systeem wordt weergegeven.
- Toepassingen waarvoor de prestaties essentieel zijn en die efficiënter kunnen worden geschaald dan 64 logische processors, moeten worden gewijzigd om op dergelijke systemen te kunnen worden uitgevoerd. Databasetoepassingen kunnen bijvoorbeeld baat hebben bij wijzigingen.
- Als een toepassing gebruikmaakt van een DLL met gegevensstructuren per processor en het DLL-bestand niet is gewijzigd ter ondersteuning van meer dan 64 logische processors, moeten alle threads in de toepassing die functies aanroept die door het DLL-bestand worden geëxporteerd, worden toegewezen aan dezelfde groep.
Standaard is een toepassing beperkt tot één groep, wat voldoende verwerkingscapaciteit voor de typische toepassing moet bieden. Het besturingssysteem wijst in eerste instantie elk proces toe aan één groep op een round robin-manier over de groepen in het systeem. Een proces begint met de uitvoering die is toegewezen aan één groep. De eerste thread van een proces wordt in eerste instantie uitgevoerd in de groep waaraan het proces is toegewezen. Elke zojuist gemaakte thread wordt toegewezen aan dezelfde groep als de thread die deze heeft gemaakt.
Een toepassing die het gebruik van meerdere groepen vereist, zodat deze op meer dan 64 processors kan worden uitgevoerd, moet expliciet bepalen waar de threads moeten worden uitgevoerd en verantwoordelijk is voor het instellen van de processoraffiniteit van de threads op de gewenste groepen. De vlag INHERIT_PARENT_AFFINITY kan worden gebruikt om een bovenliggend proces (dat kan afwijken van het huidige proces) op te geven waaruit de affiniteit voor een nieuw proces moet worden gegenereerd. Als het proces in één groep wordt uitgevoerd, kan het de affiniteit lezen en wijzigen met behulp van GetProcessAffinityMask en SetProcessAffinityMask terwijl het in dezelfde groep blijft; als de procesaffiniteit wordt gewijzigd, wordt de nieuwe affiniteit toegepast op de threads.
De affiniteit van een thread kan worden opgegeven bij het maken met behulp van het uitgebreide kenmerk PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY met de functie CreateRemoteThreadEx. Nadat de thread is gemaakt, kan de affiniteit worden gewijzigd door SetThreadAffinityMask of SetThreadGroupAffinityaan te roepen. Als een thread is toegewezen aan een andere groep dan het proces, wordt de affiniteit van het proces bijgewerkt om de affiniteit van de thread op te nemen en wordt het proces een proces met meerdere groepen. Verdere affiniteitswijzigingen moeten worden aangebracht voor afzonderlijke threads; De affiniteit van een proces met meerdere groepen kan niet worden gewijzigd met SetProcessAffinityMask. De functie GetProcessGroupAffinity haalt de set groepen op waaraan een proces en de bijbehorende threads worden toegewezen.
Als u affiniteit wilt opgeven voor alle processen die zijn gekoppeld aan een taakobject, gebruikt u de functie SetInformationJobObject met de JobObjectGroupInformation- of JobObjectGroupInformationEx informatieklasse.
Een logische processor wordt geïdentificeerd door het groepsnummer en het groeps-relatieve processornummer. Dit wordt vertegenwoordigd door een PROCESSOR_NUMBER structuur. Numerieke processornummers die door verouderde functies worden gebruikt, zijn groeps-relatief.
Zie het witboek Ondersteunende systemen met meer dan 64 processorsvoor een bespreking van de wijzigingen in de besturingssysteemarchitectuur ter ondersteuning van meer dan 64 processors.
Zie Wat is er nieuw in processen en threadsvoor een lijst met nieuwe functies en structuren die processorgroepen ondersteunen.
Gedrag vanaf Windows 11 en Windows Server 2022
Notitie
Vanaf Windows 11 en Windows Server 2022 is het niet langer het geval dat toepassingen standaard worden beperkt tot één processorgroep. In plaats daarvan hebben processen en hun threads processoraffiniteit die standaard alle processors in het systeem omvatten, in meerdere groepen op computers met meer dan 64 processors.
Om automatisch te kunnen profiteren van alle processors op een computer met meer dan 64 processors, vanaf Windows 11 en Windows Server 2022, is het besturingssysteem gewijzigd om processen en hun threads alle processors in het systeem te maken, standaard in alle processorgroepen. Dit betekent dat toepassingen de affiniteiten van hun threads niet meer expliciet hoeven in te stellen om toegang te krijgen tot meerdere processorgroepen.
Om compatibiliteitsredenen maakt het besturingssysteem gebruik van een nieuw primaire groep concept voor zowel processen als threads. Aan elk proces wordt een primaire groep toegewezen bij het maken en standaard is de primaire groep van alle threads hetzelfde. De ideale processor van elke thread bevindt zich in de primaire groep van de thread, zodat threads voorkeur worden gepland voor processors in hun primaire groep, maar ze kunnen worden gepland voor processors op elke andere groep. Affiniteits-API's die niet groepsbewust zijn of die op één groep werken, gebruiken impliciet de primaire groep als de proces-/threadprocessorgroep; Raadpleeg de secties Opmerkingen voor het volgende voor meer informatie over het nieuwe gedrag:
- GetProcessAffinityMask-
- SetProcessAffinityMask-
- SetThreadAffinityMask-
- GetProcessGroupAffinity-
- GetThreadGroupAffinity-
- SetThreadGroupAffinity-
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx-
Toepassingen kunnen CPU-sets gebruiken om de affiniteit van een proces of thread effectief te beheren via meerdere processorgroepen.
Verwante onderwerpen