Já é possível limitar os núcleos em que um processo pode ser executado definindo a afinidade dos processos . No Linux, isso pode ser feito usando taskset
para limitar os núcleos nos quais o processo pode ser executado. Por padrão, o Linux usa um agendador de tarefas preventivas , que é quase idêntico ao que você descreve em (2)
. Quase todos os principais sistemas operacionais usam esse tipo de agendador de tarefas, o que resultará em um processo sendo executado em vários núcleos por padrão.
Para garantir seu processo é executado por X
no núcleo Y
, como você sugeriu em (1)
, seria necessário o uso de um sistema operacional em tempo real; existe também um módulo de kernel em tempo real para Linux (por exemplo, RTLinux ).
TL, DR: Em resposta à pergunta Como posso efetivamente compartilhar um processo entre os núcleos? todos os principais sistemas operacionais já fazem isso devido ao agendador de tarefas sendo usado . O trabalho de um sistema operacional é controlar qual processo é executado em que horário e onde. Embora você possa "fixar" um processo em um núcleo específico (ou conjunto de núcleos) e impedi-lo de executar em outros núcleos (via taskset
), o sistema operacional ainda agendará outros processos para serem executados nesse núcleo quando o processo é preempted.
Se você precisar garantir a execução do seu programa por pelo menos X
de tempo no núcleo Y
, você deve considerar um kernel em tempo real ou "ajuste" do agendador de tarefas que você já usa para usar diferentes preempções políticas (ou mesmo trocar o agendador de tarefas inteiro por outro!). Observe que apenas um sistema operacional em tempo real garantirá a execução .