Conforme explicado em vários artigos (um tanto antigos) , a tarefa ociosa do Linux (PID=0, uma por CPU) é executada quando não há outras tarefas a serem executadas. Para que o agendador faça isso, a tarefa ociosa deve ter a prioridade mais baixa reservada para ela. Aquele velho Documentation/ftrace.txt
no artigo LWN vinculado diz explicitamente que
O prio "140" é reservado para a tarefa ociosa que é o segmento de prioridade mais baixa (pid 0).
Isso faz sentido, mas no Linux 4.9
# perf record -e sched:sched_switch sleep 1
# perf script
sleep 6526 [000] 362661.310842: sched:sched_switch: sleep:6526 [120] S ==> swapper/0:0 [120]
relata uma prioridade de 120 para swapper/0
(no colchete de fechamento), contradizendo o acima.
Como o agendador do Linux lida com a tarefa ociosa hoje em dia? A mudança de commits ftrace.txt
(87d80de28, 294ae4011) não ajudou.
Recebi uma boa resposta de Till Smejkal na lista de discussão do Linux Kernel:
No entanto, de acordo com meu entendimento, as tarefas podem ter uma prioridade apesar de não serem gerenciadas pelo CFS: as tarefas de tempo real (
SCHED_FIFO
eSCHED_RR
) pertencemrt_sched_class
e certamente têm prioridades significativas (conforme exigido pelo POSIX):Mas o ponto principal agora é o escalonamento das prioridades das classes , que é implementado pelas seguintes
const struct sched_class
estruturas sendo ligadas por seus.next
ponteiros nesta ordem:Esta lista encadeada é percorrida por (
kernel/sched/sched.h
)Conforme mencionado na citação acima,
pick_next_task()
inkernel/sched/core.c
solicita a cada classe uma tarefa executável como esta:Tudo isso significa que as tarefas ociosas têm um valor de prioridade (algum padrão), mas nunca são consultadas durante as decisões de agendamento, porque são as únicas tarefas (fixadas a CPUs específicas) em
idle_sched_class
.O exposto acima deixa em aberto a questão do valor de prioridade alterado, mas isso é principalmente de importância histórica até agora (as citações de código acima são do Linux 4.16).