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 è uguale a un pacchetto del processore, a un socket o a una CPU.

Il supporto per i sistemi con più di 64 processori logici si basa sul concetto di gruppo di processori, ovvero un set statico di un massimo di 64 processori logici che viene considerato come una singola entità di pianificazione. I gruppi di processori sono 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.

All'avvio del sistema, 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 i processori che potrebbero arrivare mentre il sistema è in esecuzione. 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 località fisica quando si assegnano processori logici ai gruppi. Se possibile, tutti i processori logici in un core e tutti i core in un processore fisico vengono assegnati allo stesso gruppo. I processori fisici 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 non 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 è Gestione attività di Windows, 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 le 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 nel sistema. Un processo avvia l'esecuzione assegnata a un gruppo. Il primo thread di un processo viene inizialmente eseguito nel gruppo a cui è assegnato il processo. Ogni thread appena creato viene assegnato allo stesso gruppo del thread che lo ha 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 sui 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 l'affinità usando GetProcessAffinityMask e SetProcessAffinityMask mentre rimane nello stesso gruppo. Se l'affinità di processo viene modificata, la nuova affinità viene applicata ai thread.

È possibile specificare l'affinità di un thread durante la creazione usando l'attributo esteso PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY con la funzione CreateRemoteThreadEx. Dopo aver creato il thread, l'affinità può essere modificata chiamando SetThreadAffinityMask o SetThreadGroupAffinity. Se un thread viene assegnato a un gruppo diverso rispetto al processo, l'affinità del processo viene aggiornata per includere l'affinità del thread e il processo diventa un processo multigruppo. È necessario apportare ulteriori modifiche di affinità per i singoli thread; Non è possibile modificare l'affinità di un processo multigruppo 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, utilizzare la funzione SetInformationJobObject con la classe di informazioni JobObjectGroupInformation o JobObjectGroupInformationEx.

Un processore logico è identificato dal numero di gruppo e dal relativo numero di processore relativo al gruppo. Questa struttura è rappresentata da una struttura PROCESSOR_NUMBER. I numeri numerici del processore usati dalle funzioni legacy sono relativi al gruppo.

Per una descrizione delle modifiche all'architettura del sistema operativo per supportare più di 64 processori, vedere il white paper Che supporta sistemi con più di 64 processori.

Per un elenco di nuove funzioni e strutture che supportano i gruppi di processori, vedere Novità di Processi e 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à del 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 creare 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 sia per i processi che per i thread. A ogni processo viene assegnato un gruppo primario al momento della 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 preferibilmente ai processori nel proprio gruppo primario, ma possono essere pianificati in processori in qualsiasi altro gruppo. Le API di affinità che non sono compatibili con il gruppo o che operano su un singolo gruppo usano in modo implicito il gruppo primario come gruppo di elaborazione/thread processori; Per altre informazioni sui nuovi comportamenti, vedere le sezioni Osservazioni per quanto segue:

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.

Processori multipli

Supporto NUMA