Não realmente.
Isso certamente não pode ser feito de maneira portátil. Você não especificou em qual sistema você está tentando fazer isso. Eu vou assumir que é o Linux, já que é o que eu sei melhor, mas fique à vontade para esclarecer.
O kernel do Linux tem duas chamadas de sistema lidando com "Afinidade de CPU", sched_setaffinity()
e sched_getaffinity()
. Estes podem ser usados para dizer ao kernel quais núcleos um processo pode rodar. Se o número de CPUs for menor que o número de threads que o processo está usando atualmente, então por necessidade ele começará a usar menos núcleos. O problema com este método, entretanto, é que ele força um conjunto particular de núcleos de CPU para o processo rodar. Se é um trabalho intensivo da CPU, isso significa que esses núcleos podem aquecer; Se o sistema não tem resfriamento suficiente para resfriar a CPU o suficiente para que seja menos problemático, então a solução é que o kernel re-programa o processo em questão para um núcleo diferente, permitindo que o kernel apenas resfrie um bit no tempo médio. Forçando um conjunto de núcleos para rodar, este método não funciona mais, e o kernel então terá que voltar a mudar a freqüência da CPU. Se você está tentando limitar os núcleos, porque há outros processos em execução que você quer dar algum tempo de CPU, no entanto, isso provavelmente não importa tanto.
As chamadas do sistema sched_setaffinity()
e sched_getaffinity()
podem ser acessadas na linha de comando com o comando taskset
:
taskset -p 0x3 $PID
dirá ao kernel que o processo com pid $PID
pode, a partir de agora, ser executado apenas nos núcleos 0 e 1 do processador. (o 0x3 é uma máscara de bits, onde o bit 1 se refere ao núcleo 0 e o bit 2 para core 1).
A máscara de afinidade é binária e é inserida como um número hexadecimal, você pode especificar quais CPUs utilizar usando a tabela completa para um processador quad-core abaixo:
0x1 - cpu0
0x2 - cpu1
0x3 - cpu0 and cpu1
0x4 - cpu2
0x5 - cpu0 and cpu2
0x6 - cpu1 and cpu2
0x7 - cpu0, cpu1 and cpu2
0x8 - cpu3
0x9 - cpu0 and cpu3
0xA - cpu1 and cpu3
0xB - cpu0, cpu1 and cpu3
0xC - cpu2 and cpu3
0xD - cpu0, cpu2 and cpu3
0xE - cpu1, cpu2 and cpu3
0xF - cpu0, cpu1, cpu2 and cpu3