CPU Affinity é uma propriedade de gerenciamento do sistema que permite direcionar para um ou mais núcleos específicos do processador um determinado processo ou programa manualmente, saiba mais sobre esse mecanismo na matéria.
Veja como atribuir um certo processo a um certo núcleo do processador
Estamos conversando esta semana com alguns amigos do grupo do Diolinux no Facebook e essa questão foi levantada, se seria possível não apenas alterar a prioridade de um determinado processo mas também atribuir um processo a um determinado núcleo do processador.
Basicamente o que você precisa ter para poder realizar uma ação destas é ter um processador multi núcleo sem restrição por marca ou modelo, pode ser tanto Intel quanto AMD, mesmo assim é bom lembrar que quanto mais núcleos o seu processador tiver mais opções você tem.
Eu vou tentar simplificar uma coisa complicada
Normalmente a função de atribuir um processo a um núcleo é atribuída ao sistema operacional, descendo de nível um pouco mais, é função do kernel e sendo mais específico ainda é um processo do Kernel chamado “Scheduler”, é ele que vai definir a afinidade de um processo e atribuí-lo a um núcleo, para entender o que acontece normalmente vamos utilizar um exemplo:
Ao abrir o programa de edição de imagens GIMP o sistema vai se encarregar de atribuir o processo do GIMP, quando você abrir outro programa qualquer ele terá momentaneamente uma prioridade mais alta e tomara o lugar do GIMP neste núcleo, mas como o sistema gerencia os processos de um jeito inteligente ele irá jogar o GIMP para outro núcleo, mantendo assim o desempenho dos dois programas.
Caso você atribua o GIMP manualmente a um determinado núcleo, usando o mesmo exemplo acima, quando você abrir um outro programa e este exigir a atenção do núcleo onde o GIMP está é possível que o processo GIMP fique parado até que o processador “tenha tempo de falar com ele de novo”, ou seja, nesta caso não é muito vantajoso.
Por que você faria isso então?
Em primeiro lugar, por que você pode! Em segundo lugar, pode ser interessante para o gerenciamento de energia, você pode utilizar apenas um núcleo para rodar determinados programas e assim fazer a sua bateria durar mais.
No fim das contas acho que esta matéria serve mais para conhecimento do que para utilização, na maioria das vezes a melhor opção é deixar o sistema trabalhar para você.
Como funciona o taskset
Para mandarmos um processo direto para ser executado por um determinado núcleo ou núcleos nós vamos utilizar o taskset, que é um recurso que já vem junto com kernel Linux.
Se você observar o aplicativo que vem junto com a maioria dos sistemas, no caso do Ubuntu, o Monitor do Sistema onde você pode ver o nome de todos os processos, na aba “Recursos” você consegue ver quantos núcleos o seu processador tem.
Existem duas formas de utilizar o taskset, abrindo um programa que estava fechado ou modificando um processo que já está em execução, por exemplo:
Para direcionar um processo já aberto para um núcleo do processador no terminal fazemos assim:
taskset -pc 0 2432
Sendo que:
Azul: É nome do comando usado para setar o processo a um determinado CPU
Laranja: É o parâmetro utilizando para modificar um programa já aberto.
Preto: É o número do núcleo do processador, 0 para o primeiro núcleo, 1 para o segundo, 2 para o terceiro e assim por diante.
Vermelho: O vermelho é o número do PID, se você observar na imagem do monitor do sistema acima onde é possível mostrar os processos na coluna de PIDS, este número utilizado no exemplo é o do GIMP.
Caso você queira abrir um programa já direcionando ele para um determinado núcleo faça assim:
taskset -c 0 gimp
Sendo que o primeiro comando é igual, o “-c” serve para direcionar o processo para um núcleo, “0” é mais uma vez o número do núcleo que você deseja mandar o programa e “gimp” no exemplo, é o programa que eu quero abrir.
Se quiser direcionar o processo para dois núcleos faça assim:
taskset -c 0,1 gimp
Observe o “0,1” isso indica quais são os núcleos que trabalharão com o GIMP (no exemplo), o mesmo pode ser feito para a primeira opção
Basicamente é isso, se você tiver alguma dúvida deixe-a nos comentários logo abaixo.