Grupos de processadores

As versões de 64 bits do Windows 7 e Windows Server 2008 R2 e versões posteriores do Windows dão 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ógica da perspectiva do sistema operacional, 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 baseia-se 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, o Grupo 0.

Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: Não há suporte para grupos de processadores.

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, não quatro grupos com 32 processadores lógicos em cada grupo.

Para obter um melhor desempenho, o sistema operacional leva em conta 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 que estão fisicamente próximos um do outro 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. Aplicativos que não chamam funções que usam 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 dar suporte a mais de 64 processadores lógicos. Um exemplo desse aplicativo é Windows Gerenciador de Tarefas, que exibe a carga de trabalho de cada processador no sistema.
  • Aplicativos para os quais o desempenho é crítico e que podem ser dimensionados com eficiência além de 64 processadores lógicos devem ser modificados para serem executados nesses sistemas. Por exemplo, aplicativos de banco de dados podem se beneficiar de modificações.
  • Se um aplicativo usar uma DLL que tenha estruturas de dados por processador e a DLL não tiver sido modificada para dar suporte a mais de 64 processadores lógicos, todos os threads no aplicativo que chamam funções exportadas pela DLL deverão 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. Inicialmente, o sistema operacional atribui cada processo a um único grupo de maneira round robin entre os grupos no sistema. Um processo inicia sua execução atribuída 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 do processador dos threads com os grupos desejados. O sinalizador INHERIT_PARENT_AFFINITY pode ser usado para especificar um processo pai (que pode ser diferente do processo atual) do qual gerar a afinidade para um novo processo. Se o processo estiver em execução 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 aos 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 estrutura de PROCESSOR_NUMBER . Os números de processador numérico usados por funções herdadas são relativos ao grupo.

Para obter uma discussão sobre alterações na arquitetura do sistema operacional para dar suporte a mais de 64 processadores, consulte o white paper que dá suporte a sistemas com mais de 64 processadores.

Para obter uma lista de novas funções e estruturas que dão suporte a grupos de processadores, consulte o que há de novo em processos e threads.

Comportamento começando com Windows 11 e Windows Server 2022

Observação

Começando com Windows 11 e Windows Server 2022, não é mais o caso de que os aplicativos sejam 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 computadores com mais de 64 processadores.

Para que os aplicativos aproveitem automaticamente todos os processadores em um computador com mais de 64 processadores, começando com Windows 11 e Windows Server 2022, o sistema operacional mudou para tornar os processos e seus threads abrangem 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. Cada processo recebe 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 agendados preferencialmente 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 têm reconhecimento de grupo ou operam em um único grupo usam implicitamente o grupo primário como o grupo de processadores de processo/thread; para obter mais informações sobre os novos comportamentos, verifique as seções Comentários para obter o seguinte:

Os aplicativos podem usar conjuntos de CPU para gerenciar efetivamente a afinidade de um processo ou thread em vários grupos de processadores.

Vários processadores

Suporte ao NUMA