Nota
O acesso a esta página requer autorização. Pode tentar iniciar sessão ou alterar os diretórios.
O acesso a esta página requer autorização. Pode tentar alterar os diretórios.
As versões de 64 bits do Windows 7 e Windows Server 2008 R2 e versões posteriores do Windows suportam mais de 64 processadores lógicos num único computador. Esta 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 perspetiva do sistema operativo, aplicação 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 encapsulamento de processador, um socket ou uma CPU.
O suporte para sistemas que têm 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. Os sistemas com menos de 64 processadores lógicos têm sempre um único grupo, o Grupo 0.
Windows Server 2008, Windows Vista, Windows Server 2003 e Windows XP: grupos de processadores não são suportados.
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 operativo reserva espaço nos grupos para processadores que possam 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 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 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 obter mais informações, consulte Suporte NUMA.
Em sistemas com 64 ou menos processadores, os aplicativos existentes funcionarão corretamente sem modificações. 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 suportar mais de 64 processadores lógicos. Um exemplo de tal aplicação é o Gestor de Tarefas do Windows, que exibe a carga de trabalho de cada processador no sistema.
- Aplicações para os quais o desempenho é crítico e que podem ser dimensionados de forma eficiente além de 64 processadores lógicos devem ser modificados para serem executados nesses sistemas. Por exemplo, os 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 suportar 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 forma round-robin entre os grupos no sistema. Um processo começa a sua execução atribuído a um grupo. O primeiro thread de um processo corre inicialmente no grupo ao qual o processo é atribuído. Cada thread recém-criada é atribuída ao mesmo grupo que a thread que a 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 a ser executado num único grupo, poderá ler e modificar a 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 uma thread pode ser especificada na criação usando o atributo alargado PROC_THREAD_ATTRIBUTE_GROUP_AFFINITY com a função CreateRemoteThreadEx. Depois de o thread ser 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 multigrupo. Outras alterações de afinidade devem ser feitas para threads individuais; a afinidade de um processo multigrupo não pode ser modificada usando SetProcessAffinityMask. A função GetProcessGroupAffinity recupera o conjunto de grupos aos quais um processo e os respetivos threads são atribuídos.
Para especificar a afinidade para todos os processos associados a um objeto de trabalho, use a função SetInformationJobObject com a classe de informação JobObjectGroupInformation ou JobObjectGroupInformationEx.
Um processador lógico é identificado pelo seu número de grupo e pelo seu número de processador relativo ao grupo. Isto é representado por uma estrutura PROCESSOR_NUMBER. Os números do processador numérico usados pelas 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 Supporting Systems That Have More Than 64 Processors.
Para obter uma lista de novas funções e estruturas que suportam grupos de processadores, consulte O que há de novo em processos e threads.
Comportamento a partir do Windows 11 e do Windows Server 2022
Observação
A partir do Windows 11 e do Windows Server 2022, as aplicações deixaram de estar, por predefinição, limitadas a um único grupo de processadores. Em vez disso, os processos e os respetivos 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 as aplicações tirem automaticamente partido de todos os processadores numa máquina com mais de 64 processadores, a partir do Windows 11 e do Windows Server 2022, o sistema operativo foi alterado para fazer com que os processos e os respetivos threads abranjam todos os processadores do sistema, em todos os grupos de processadores, por predefiniçã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, o grupo primário de todos os seus threads é o mesmo. O processador ideal de cada thread está no grupo primário da thread, portanto, as threads serão preferencialmente agendadas para processadores no seu grupo primário, mas podem ser agendadas para processadores em qualquer outro grupo. APIs de afinidade que não são compatíveis com grupos ou operam num único grupo usam implicitamente o grupo primário como o grupo de processadores do processo/thread; para obter mais informações sobre os novos comportamentos, consulte as secções Comentários relativas ao seguinte:
- GetProcessAffinityMask
- SetProcessAffinityMask
- SetThreadAffinityMask
- GetProcessGroupAffinity
- GetThreadGroupAffinity
- SetThreadGroupAffinity
- SetThreadIdealProcessor
- SetThreadIdealProcessorEx
As aplicações podem usar CPU Sets para gerir eficazmente a afinidade de um processo ou thread em vários grupos de processadores.
Tópicos relacionados