Gruppi di processori
Le versioni a 64 bit di Windows 7 e Windows Server 2008 R2 e versioni successive di Windows supportano più di 64 processori logici in un singolo computer. Questa funzionalità non è disponibile nelle versioni a 32 bit di Windows.
I sistemi con più processori fisici o sistemi con processori fisici con più core forniscono al sistema operativo più processori logici. Un processore logico è un motore di calcolo logico dal punto di vista del sistema operativo, dell'applicazione o del driver. Un core è un'unità processore, che può essere costituita da uno o più processori logici. Un processore fisico può essere costituito da uno o più core. Un processore fisico è lo stesso di un pacchetto processore, un socket o una CPU.
Il supporto per i sistemi con più di 64 processori logici si basa sul concetto di un gruppo di processori, ovvero un set statico di fino a 64 processori logici trattati come singola entità di pianificazione. I gruppi di processori vengono numerati a partire da 0. I sistemi con meno di 64 processori logici hanno sempre un singolo gruppo, Gruppo 0.
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: i gruppi di processori non sono supportati.
Al momento dell'avvio del sistema operativo, il sistema operativo crea gruppi di processori e assegna processori logici ai gruppi. Se il sistema è in grado di aggiungere processori ad accesso frequente, il sistema operativo consente spazio in gruppi per processori che potrebbero arrivare durante l'esecuzione del sistema. Il sistema operativo riduce al minimo il numero di gruppi in un sistema. Ad esempio, un sistema con 128 processori logici avrebbe due gruppi di processori con 64 processori in ogni gruppo, non quattro gruppi con 32 processori logici in ogni gruppo.
Per prestazioni migliori, il sistema operativo tiene conto della localizzazione fisica quando si assegnano processori logici ai gruppi. Tutti i processori logici in un core e tutti i core in un processore fisico, vengono assegnati allo stesso gruppo, se possibile. I processori fisici che sono fisicamente vicini l'uno all'altro vengono assegnati allo stesso gruppo. Un nodo NUMA viene assegnato a un singolo gruppo, a meno che la capacità del nodo superi le dimensioni massime del gruppo. Per altre informazioni, vedere Supporto NUMA.
Nei sistemi con 64 o meno processori, le applicazioni esistenti funzioneranno correttamente senza modifiche. Le applicazioni che non chiamano funzioni che usano maschere di affinità processore o numeri di processore funzioneranno correttamente in tutti i sistemi, indipendentemente dal numero di processori. Per funzionare correttamente nei sistemi con più di 64 processori logici, i tipi di applicazioni seguenti potrebbero richiedere modifiche:
- Le applicazioni che gestiscono, gestiscono o visualizzano informazioni per processore per l'intero sistema devono essere modificate per supportare più di 64 processori logici. Un esempio di tale applicazione è Windows Task Manager, che visualizza il carico di lavoro di ogni processore nel sistema.
- Le applicazioni per le quali le prestazioni sono critiche e che possono essere ridimensionate in modo efficiente oltre 64 processori logici devono essere modificate per l'esecuzione in tali sistemi. Ad esempio, le applicazioni di database possono trarre vantaggio dalle modifiche.
- Se un'applicazione usa una DLL con strutture di dati per processore e la DLL non è stata modificata per supportare più di 64 processori logici, tutti i thread nell'applicazione che chiamano funzioni esportate dalla DLL devono essere assegnati allo stesso gruppo.
Per impostazione predefinita, un'applicazione è vincolata a un singolo gruppo, che deve fornire un'ampia funzionalità di elaborazione per l'applicazione tipica. Il sistema operativo assegna inizialmente ogni processo a un singolo gruppo in modo round robin tra i gruppi del sistema. Un processo inizia l'esecuzione assegnata a un gruppo. Il primo thread di un processo viene eseguito inizialmente nel gruppo a cui viene assegnato il processo. Ogni thread appena creato viene assegnato allo stesso gruppo del thread creato.
Un'applicazione che richiede l'uso di più gruppi in modo che possa essere eseguita su più di 64 processori deve determinare in modo esplicito dove eseguire i thread ed è responsabile dell'impostazione delle affinità del processore dei thread ai gruppi desiderati. Il flag INHERIT_PARENT_AFFINITY può essere usato per specificare un processo padre (che può essere diverso dal processo corrente) da cui generare l'affinità per un nuovo processo. Se il processo è in esecuzione in un singolo gruppo, può leggere e modificare la sua affinità usando GetProcessAffinityMask e SetProcessAffinityMask mentre rimane nello stesso gruppo; se l'affinità del processo viene modificata, la nuova affinità viene applicata ai thread.
L'affinità di un thread può essere specificata alla creazione usando l'attributo esteso PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY con la funzione CreateRemoteThreadEx . Dopo la creazione del thread, la relativa affinità può essere modificata chiamando SetThreadAffinityMask o SetThreadGroupAffinity. Se un thread viene assegnato a un gruppo diverso dal processo, l'affinità del processo viene aggiornata per includere l'affinità del thread e il processo diventa un processo multi-group. È necessario apportare ulteriori modifiche di affinità per i singoli thread; Non è possibile modificare l'affinità di un processo a più gruppi usando SetProcessAffinityMask. La funzione GetProcessGroupAffinity recupera il set di gruppi a cui viene assegnato un processo e i relativi thread.
Per specificare l'affinità per tutti i processi associati a un oggetto processo, usare la funzione SetInformationJobObject con la classe di informazioni JobObjectGroupInformation o JobObjectGroupInformationEx.
Un processore logico viene identificato dal relativo numero di gruppo e dal relativo numero di processore relativo al gruppo. Questo è rappresentato da una struttura PROCESSOR_NUMBER . I numeri di processore numerici usati dalle funzioni legacy sono relativi al gruppo.
Per una discussione sulle modifiche apportate all'architettura del sistema operativo per supportare più di 64 processori, vedere il white paper che supporta i sistemi con più di 64 processori.
Per un elenco di nuove funzioni e strutture che supportano i gruppi di processori, vedere Novità nei processi e nei thread.
Comportamento a partire da Windows 11 e Windows Server 2022
Nota
A partire da Windows 11 e Windows Server 2022, non è più il caso in cui le applicazioni siano vincolate per impostazione predefinita a un singolo gruppo di processori. I processi e i relativi thread hanno invece affinità di processore che per impostazione predefinita si estendono su tutti i processori nel sistema, in più gruppi su computer con più di 64 processori.
Per consentire alle applicazioni di sfruttare automaticamente tutti i processori in un computer con più di 64 processori, a partire da Windows 11 e Windows Server 2022 il sistema operativo è cambiato per rendere i processi e i relativi thread si estendono su tutti i processori nel sistema, in tutti i gruppi di processori, per impostazione predefinita. Ciò significa che le applicazioni non devono più impostare in modo esplicito le affinità dei thread per accedere a più gruppi di processori.
Per motivi di compatibilità, il sistema operativo usa un nuovo concetto di gruppo primario per i processi e i thread. Ogni processo viene assegnato a un gruppo primario alla creazione e per impostazione predefinita tutti i relativi gruppi primari dei thread sono uguali. Il processore ideale di ogni thread si trova nel gruppo primario del thread, quindi i thread saranno pianificati in modo preferenziale ai processori nel gruppo primario, ma sono in grado di essere pianificati ai processori in qualsiasi altro gruppo. LE API di affinità che non sono a conoscenza del gruppo o operano in un singolo gruppo usano implicitamente il gruppo primario come gruppo di elaborazione/thread; per altre informazioni sui nuovi comportamenti, controllare le sezioni Osservazioni per quanto segue:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
Le applicazioni possono usare set di CPU per gestire in modo efficace l'affinità di un processo o di un thread su più gruppi di processori.
Argomenti correlati