Você quer restringir um aplicativo ou serviço específico para usar apenas determinados núcleos de CPU no Windows 11 ou Windows 10. Isso é necessário quando um processo em segundo plano monopoliza recursos do processador ou quando você precisa garantir que um aplicativo crítico tenha acesso dedicado a núcleos. O Windows inclui uma ferramenta interna chamada máscara de afinidade do processador que permite vincular um processo a processadores lógicos específicos. Este artigo explica como usar o PowerShell para definir a afinidade de núcleo de CPU para qualquer processo em execução.
Principais conclusões: Definindo afinidade de processo com PowerShell
- Get-Process e (Get-Process).ProcessorAffinity: Recupere a máscara de afinidade atual de qualquer processo em execução.
- Cálculo da máscara de afinidade (binário para decimal): Converta o conjunto de núcleos de CPU desejados em um número decimal que representa a máscara de bits dos núcleos.
- (Get-Process -Id PID).ProcessorAffinity = ValorDecimal: Atribua diretamente uma nova máscara de afinidade a um processo pelo seu ID de processo.
O que é afinidade de núcleo de CPU e por que alterá-la
Todo processo em execução no Windows tem uma propriedade chamada Processor Affinity. Essa propriedade define quais núcleos de CPU lógicos o escalonador do sistema operacional pode usar ao atribuir threads desse processo. Por padrão, um processo pode ser executado em qualquer núcleo. Alterar a afinidade restringe o processo a um subconjunto de núcleos.
Você pode querer restringir um processo a núcleos específicos por vários motivos. Um aplicativo que consome muitos recursos, como um codificador de vídeo ou um host de máquina virtual, pode ser confinado a alguns núcleos para que outros processos obtenham os núcleos restantes. Alguns softwares legados têm restrições de licenciamento vinculadas ao número de núcleos. Em cenários de teste, você simula um ambiente de núcleo único ou duplo limitando um processo a um ou dois núcleos.
A máscara de afinidade é uma máscara de bits onde cada bit representa um processador lógico. O núcleo 0 é o bit 0, valor 1. O núcleo 1 é o bit 1, valor 2. O núcleo 2 é o bit 2, valor 4. O núcleo 3 é o bit 3, valor 8, e assim por diante. Para atribuir os núcleos 0 e 2, some seus valores 1 + 4 = 5. O valor decimal 5 é a máscara de afinidade para os núcleos 0 e 2.
Pré-requisitos
Você precisa do Windows PowerShell 5.1 ou PowerShell 7 no Windows 10 ou Windows 11. Execute o PowerShell como Administrador para alterar a afinidade de processos do sistema. Para seus próprios processos de usuário, direitos de Administrador não são necessários.
Passos para restringir um processo específico a um conjunto de núcleos de CPU usando PowerShell
Siga estas etapas para identificar o processo alvo, calcular a máscara de afinidade correta e aplicar a alteração.
- Abra o PowerShell como Administrador
Pressione a tecla Windows, digite PowerShell, clique com o botão direito em Windows PowerShell ou PowerShell e selecione Executar como administrador. Clique em Sim se solicitado pelo Controle de Conta de Usuário. - Encontre o ID do processo (PID) do processo alvo
Execute o comandoGet-Process -Name "notepad" | Format-Table Id, ProcessNamesubstituindo notepad pelo nome real do processo. Se você não souber o nome exato, executeGet-Process | Select-Object Id, ProcessNamepara listar todos os processos em execução. Anote o PID do processo alvo. - Determine a máscara de afinidade decimal para os núcleos desejados
Decida quais núcleos de CPU você deseja atribuir. Por exemplo, para usar os núcleos 0 e 2 em um sistema com 4 núcleos lógicos, a máscara binária é 0101 (bits 0 e 2 definidos). O valor decimal é 1 + 4 = 5. Para cálculo fácil, use este one-liner do PowerShell:$cores = @(0,2); $mask = 0; foreach ($c in $cores) { $mask += [math]::Pow(2, $c) }; $mask. Isso gera o valor decimal da máscara 5. - Defina a afinidade do processador para o processo alvo
Use o comando(Get-Process -Id PID).ProcessorAffinity = MascaraDecimal. Substitua PID pelo ID do processo real e MascaraDecimal pelo valor decimal da etapa 3. Por exemplo:(Get-Process -Id 1234).ProcessorAffinity = 5. Isso restringe o processo aos núcleos 0 e 2. - Verifique a alteração
Execute(Get-Process -Id PID).ProcessorAffinitypara confirmar que o valor da máscara corresponde ao número decimal pretendido. A saída mostra a máscara decimal. Para ver quais núcleos estão atribuídos, converta o decimal de volta para binário:[convert]::ToString((Get-Process -Id PID).ProcessorAffinity, 2). A string binária mostra 1 para os núcleos atribuídos.
Exemplo: Restringindo o Notepad ao núcleo 0 da CPU
Abra o Notepad. Execute Get-Process -Name "notepad" | Format-Table Id, ProcessName e anote o PID, por exemplo 5678. Calcule a máscara para apenas o núcleo 0: valor decimal 1. Execute (Get-Process -Id 5678).ProcessorAffinity = 1. O Notepad agora é executado exclusivamente no núcleo 0.
Problemas comuns ao definir afinidade de processo
Erro “Acesso Negado” ao alterar a afinidade
Se você vir um erro de Acesso Negado, o processo está sendo executado como um usuário diferente ou é um processo protegido do sistema. Feche todas as instâncias do processo e execute o PowerShell como Administrador. Para processos do sistema como svchost, você deve executar o PowerShell como SYSTEM usando ferramentas como PsExec ou o Agendador de Tarefas integrado.
Afinidade é redefinida após o processo reiniciar
A alteração de afinidade não é permanente. Quando o processo é encerrado e reiniciado, o Windows atribui a afinidade padrão (todos os núcleos). Para tornar a alteração persistente, crie uma tarefa agendada que execute o comando PowerShell na inicialização ou sempre que o processo for iniciado. Use o Agendador de Tarefas para disparar o script na inicialização do processo usando eventos do Log de Eventos para criação de processo.
Contagem de núcleos ou cálculo de máscara incorretos
O Windows numera os processadores lógicos a partir de 0. Em um sistema com hyper-threading ativado, cada núcleo físico aparece como dois processadores lógicos. Use a guia Desempenho do Gerenciador de Tarefas para ver o número total de CPUs lógicas. Verifique novamente sua conversão binário para decimal. Um erro comum é usar o número de núcleos como valor da máscara. Para apenas o núcleo 3, a máscara é 8, não 3.
PowerShell Set-ProcessAffinity vs Máscara de Afinidade Manual
| Item | PowerShell (Get-Process).ProcessorAffinity | Gerenciador de Tarefas (Afinidade Manual) |
|---|---|---|
| Método | Atribuição via script na linha de comando | Caixas de seleção na interface gráfica do Gerenciador de Tarefas |
| Automação | Totalmente automatizável em scripts e tarefas agendadas | Deve ser feito manualmente toda vez que o processo inicia |
| Seleção de núcleos | Usa máscara decimal derivada da máscara de bits binária | Caixas de seleção para cada processador lógico |
| Direitos necessários | Administrador para processos do sistema | Administrador para todos os processos |
| Persistência | Não persistente entre reinicializações a menos que seja scriptado | Não persistente entre reinicializações |
Agora você pode restringir qualquer processo em execução a núcleos de CPU específicos usando um único comando PowerShell. Essa técnica oferece controle refinado sobre a alocação de recursos do processador sem ferramentas de terceiros. Para afinidade permanente, combine o comando com uma tarefa agendada que seja acionada na criação do processo. O cálculo da máscara de núcleo segue um padrão binário simples que funciona de forma idêntica no Windows 11 e Windows 10.