Em geral, o planejamento do UNIX e Linux assume muitos programas curtos (pense em ls
, ps
, grep
...) para iniciar um programa em uma CPU. Conforme os programas rodam mais (pense no Firefox, ou no Chrome), o kernel percebe que a carga está desbalanceada e migrará os processos para CPUs diferentes. Isso é feito pela tarefa de migração (conforme visto executando ps
).
Para entender como a migração é feita, consulte: link
* This is how migration works:
*
* 1) we invoke migration_cpu_stop() on the target CPU using
* stop_one_cpu().
* 2) stopper starts to run (implicitly forcing the migrated thread
* off the CPU)
* 3) it checks whether the migrated task is still in the wrong runqueue.
* 4) if it's in the wrong runqueue then the migration thread removes
* it and puts it into the right queue.
* 5) stopper completes and stop_one_cpu() returns and the migration
* is done.
Para entender como a carga é determinada, consulte:
link e veja os comentários em torno de migration
. Mas no geral, o agendador precisa analisar:
- quão ocupada a CPU é
- o custo para migrar o processo
- o número de falhas do sistema geradas
Em seguida, ele deve determinar qual processo migrar e para qual CPU migrar.
Isso tudo é bastante complicado e, portanto, se você quiser entender isso, recomendo que você olhe para: link e o papel original: The Linux Scheduler: uma década de núcleos perdidos .