Grupos de processadores
As versões de 64 bits do Windows 7 e Windows Server 2008 R2 e versões posteriores do Windows oferecem suporte a mais de 64 processadores lógicos em um único computador. Essa funcionalidade não está disponível em versões de 32 bits do Windows.
Sistemas com mais de um processador físico ou sistemas com processadores físicos que têm vários núcleos fornecem ao sistema operacional vários processadores lógicos. Um processador lógico é um mecanismo de computação lógico da perspectiva do sistema operacional, um aplicativo ou driver. Um núcleo é uma unidade de processador, que pode consistir em um ou mais processadores lógicos. Um processador físico pode consistir em um ou mais núcleos. Um processador físico é o mesmo que um pacote de processador, um soquete ou uma CPU.
O suporte para sistemas com mais de 64 processadores lógicos é baseado no conceito de um grupo de processadores, que é um conjunto estático de até 64 processadores lógicos que é tratado como uma única entidade de agendamento. Os grupos de processadores são numerados começando com 0. Sistemas com menos de 64 processadores lógicos sempre têm um único grupo, Grupo 0.
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: grupos de processador não são compatíveis.
Quando o sistema é iniciado, o sistema operacional cria grupos de processadores e atribui processadores lógicos aos grupos. Se o sistema for capaz de adicionar processadores a quente, o sistema operacional permitirá espaço em grupos para processadores que podem chegar enquanto o sistema está em execução. O sistema operacional minimiza o número de grupos em um sistema. Por exemplo, um sistema com 128 processadores lógicos teria dois grupos de processadores com 64 processadores em cada grupo, e não quatro grupos com 32 processadores lógicos em cada grupo.
Para um melhor desempenho, o sistema operacional leva em consideração a localidade física ao atribuir processadores lógicos a grupos. Todos os processadores lógicos em um núcleo, e todos os núcleos em um processador físico, são atribuídos ao mesmo grupo, se possível. Os processadores físicos fisicamente próximos uns dos outros são atribuídos ao mesmo grupo. Um nó NUMA é atribuído a um único grupo, a menos que a capacidade do nó exceda o tamanho máximo do grupo. Para saber mais, confira o Suporte à NUMA.
Em sistemas com 64 ou menos processadores, os aplicativos existentes funcionarão corretamente sem modificação. Os aplicativos que não chamam nenhuma função que usa máscaras de afinidade de processador ou números de processador funcionarão corretamente em todos os sistemas, independentemente do número de processadores. Para operar corretamente em sistemas com mais de 64 processadores lógicos, os seguintes tipos de aplicativos podem exigir modificação:
- Os aplicativos que gerenciam, mantêm ou exibem informações por processador para todo o sistema devem ser modificados para oferecer suporte a mais de 64 processadores lógicos. Um exemplo desse aplicativo é o Gerenciador de Tarefas do Windows, que exibe a carga de trabalho de cada processador no sistema.
- Aplicativos para os quais o desempenho é crítico e que podem ser dimensionados eficientemente além de 64 processadores lógicos devem ser modificados para serem executados em tais sistemas. Por exemplo, aplicativos de banco de dados podem se beneficiar de modificações.
- Se um aplicativo usa uma DLL que tem estruturas de dados por processador e a DLL não foi modificada para oferecer suporte a mais de 64 processadores lógicos, todos os threads no aplicativo que chamam funções exportadas pela DLL devem ser atribuídos ao mesmo grupo.
Por padrão, um aplicativo é restrito a um único grupo, o que deve fornecer ampla capacidade de processamento para o aplicativo típico. O sistema operacional inicialmente atribui cada processo a um único grupo de maneira round-robin entre os grupos no sistema. Um processo começa sua execução atribuído a um grupo. O primeiro thread de um processo é executado inicialmente no grupo ao qual o processo é atribuído. Cada thread recém-criado é atribuído ao mesmo grupo que o thread que o criou.
Um aplicativo que requer o uso de vários grupos para que possa ser executado em mais de 64 processadores deve determinar explicitamente onde executar seus threads e é responsável por definir as afinidades de processador dos threads para os grupos desejados. O sinalizador INHERIT_PARENT_AFFINITY pode ser usado para especificar um processo pai (que pode ser diferente do processo atual) a partir do qual gerar a afinidade para um novo processo. Se o processo estiver sendo executado em um único grupo, ele poderá ler e modificar sua afinidade usando GetProcessAffinityMask e SetProcessAffinityMask enquanto permanece no mesmo grupo, se a afinidade do processo for modificada, a nova afinidade será aplicada a seus threads.
A afinidade de um thread pode ser especificada na criação usando o atributo estendido PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY com a função CreateRemoteThreadEx. Depois que o thread é criado, sua afinidade pode ser alterada chamando SetThreadAffinityMask ou SetThreadGroupAffinity. Se um thread for atribuído a um grupo diferente do processo, a afinidade do processo será atualizada para incluir a afinidade do thread e o processo se tornará um processo de vários grupos. Outras alterações de afinidade devem ser feitas para threads individuais; a afinidade de um processo de vários grupos não pode ser modificada usando SetProcessAffinityMask. A função GetProcessGroupAffinity recupera o conjunto de grupos aos quais um processo e seus threads são atribuídos.
Para especificar afinidade para todos os processos associados a um objeto de trabalho, use a função SetInformationJobObject com a classe de informações JobObjectGroupInformation ou JobObjectGroupInformationEx.
Um processador lógico é identificado por seu número de grupo e seu número de processador relativo ao grupo. Isso é representado por uma PROCESSOR_NUMBER. Os números numéricos do processador usados por funções herdadas são relativos ao grupo.
Para obter uma discussão sobre as alterações na arquitetura do sistema operacional para oferecer suporte a mais de 64 processadores, consulte o white paper Suporte a sistemas com mais de 64 processadores.
Para obter uma lista de novas funções e estruturas que oferecem suporte a grupos de processadores, consulte O que há de novo em processos e threads.
Comportamento iniciado a partir do Windows 11 e do Windows Server 2022
Observação
A partir do Windows 11 e do Windows Server 2022, não é mais o caso de os aplicativos serem restritos por padrão a um único grupo de processadores. Em vez disso, os processos e seus threads têm afinidades de processador que, por padrão, abrangem todos os processadores do sistema, em vários grupos em máquinas com mais de 64 processadores.
Para que os aplicativos aproveitem automaticamente todos os processadores em uma máquina com mais de 64 processadores, começando com o Windows 11 e o Windows Server 2022, o sistema operacional mudou para fazer com que os processos e seus threads abranjam todos os processadores do sistema, em todos os grupos de processadores, por padrão. Isso significa que os aplicativos não precisam mais definir explicitamente as afinidades de seus threads para acessar vários grupos de processadores.
Por motivos de compatibilidade, o sistema operacional usa um novo conceito de Grupo Primário para processos e threads. A cada processo é atribuído um grupo primário na criação e, por padrão, todo o grupo primário de seus threads é o mesmo. O processador ideal de cada thread está no grupo primário do thread, portanto, os threads serão preferencialmente agendados para processadores em seu grupo primário, mas eles podem ser agendados para processadores em qualquer outro grupo. As APIs de afinidade que não reconhecem o grupo ou operam em um único grupo usam implicitamente o grupo primário como o grupo de processador de processo/thread; para obter mais informações sobre os novos comportamentos, verifique as seções Comentários para o seguinte:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
Os aplicativos podem usar Conjuntos de CPU para gerenciar com eficiência a afinidade de um processo ou thread com vários grupos de processadores.
Tópicos relacionados