4.2. Agendamento da CPU

O agendador é responsável em manter as CPUs ocupadas no sistema. O agendador do Linux implementa um número de políticas de agendamento, que determina quando e por quanto tempo uma thread foi executada em um núcleo da CPU em específico.
As políticas de agendamento são divididas em duas categorias principais:
  1. Políticas em Tempo Real (Realtime)
    • SCHED_FIFO
    • SCHED_RR
  2. Políticas Normais
    • SCHED_OTHER
    • SCHED_BATCH
    • SCHED_IDLE

4.2.1. Políticas de agendamento em Tempo Real (Realtime)

As threads em tempo real são agendadas primeiro, e threads normais são agendadas depois que todas as threads em tempo real serem agendadas.
As políticas tempo real são utilizadas para tarefas de horário crítico que devem ser concluídas sem interrupções.
SCHED_FIFO
Esta política também é mencionada como agendamento de prioridade estática, pois ela define uma prioridade fixa (entre 1 e 99) para cada thread. O agendador copia uma lista de threads SCHED_FIFO para o thread de maior prioridade que esteja pronto para ser executado. Esta thread é executada até que seja bloqueada, ou tenha admitido preempção por um thread de prioridade maior que esteja pronto para ser executado.
Até mesmo a thread em tempo real com a prioridade mais baixa será agendada antes do que qualquer thread com uma política não-tempo real; Se somente existir threads em tempo real, o valor de prioridade SCHED_FIFO não importará.
SCHED_RR
Uma variante de repetição alternada (round-robin) da política SCHED_FIFO. As threads do SCHED_RR também recebem uma prioridade fixa entre 1 e 99. No entanto, as threads com a mesma prioridade são agendadas em estilo repetição alternada dentro de um certo quantum, ou fração de tempo. A chamada do sistema sched_rr_get_interval(2) retorna o valor de fração de tempo, mas a duração da fração de tempo não pode ser estabelecida por um usuário. Esta política é útil se você precisa executar threads múltiplas na mesma prioridade.
Para mais informações detalhadas sobre a semântica definida das políticas de agendamento em tempo real, consulte o IEEE 1003.1 POSIX standard Sob Interfaces de Sistema — Realtime, a qual está disponível em http://pubs.opengroup.org/onlinepubs/009695399/functions/xsh_chap02_08.html.
A melhor forma de definir a prioridade de threads é começar com uma prioridade baixa e aumentar quando uma latência legitima for identificada. As threads Realtime threads nãopossuem o tempo fraccionado como threads normais; As threads SCHED_FIFO funcionam até que sejam bloqueadas, retiradas ou pré-esvaziadas por uma thread com uma prioridade maior. Configurar uma prioridade de 99 é portanto desencorajado, pois isto colocaria seus processos no mesmo nível de prioridade que a thread de migração e as threads watchdog. Se estas threads forem bloqueadas porque sua thread entrou no loop computacional, estes não serão executados. Os sistemas de uniprocessador será bloqueado neste caso.
No kernel do Linux, a política SCHED_FIFO inclui o mecanismo do pacote de largura de banda. Isto projeta programadores de aplicativos de realtime de tarefas realtime que podem monopolizar a CPU. Este mecanismo pode ser ajustado através dos seguintes parâmetros de sistema de arquivo /proc :
/proc/sys/kernel/sched_rt_period_us
Define o período de tempo a ser considerado cem porcento da largura de banda de CPU, em microsegundos ('us' sendo o texto simples mais próximo de 'µs'). O valor parão é de 1000000µs, ou 1 segundo.
/proc/sys/kernel/sched_rt_runtime_us
Define o período de tempo a ser devotado a threads de realtime em execução, em microsegundos ('us' sendo o texto simples mais próximo de 'µs'). O valor parão é de 950000µs, ou 0.95 segundos.