====== Escalonamento por prioridades ======
:!: alterações na interface em 03/2023
{{ :so:ppos_04_scheduler.mkv |Vídeo deste projeto}}
Este projeto consiste em adicionar um escalonador baseado em prioridades com envelhecimento ao nosso sistema operacional.
As seguintes operações devem ser implementadas:
* uma função ''scheduler'' que analisa a fila de tarefas prontas, devolvendo um ponteiro para a próxima tarefa a receber o processador.
* funções para consulta e ajuste de prioridades, indicadas abaixo.
void task_setprio (task_t *task, int prio)
Esta função ajusta a prioridade **estática**((Pode ajustar a prioridade dinâmica também, para que o efeito da mudança seja imediato.)) da tarefa ''task'' para o valor ''prio'' (que deve estar entre -20 e +20). Caso ''task'' seja nulo, ajusta a prioridade da tarefa atual.
int task_getprio (task_t *task)
Esta função devolve o valor da prioridade **estática** da tarefa ''task'' (ou da tarefa corrente, se ''task'' for nulo).
===== Observações =====
* O escalonador deve usar prioridades no estilo UNIX (valores entre -20 e +20, com escala negativa).
* Para que o escalonador funcione corretamente, ele deve implementar um esquema de envelhecimento de tarefas (//task aging// com α = -1). Caso contrário, sempre a mesma tarefa será escalonada para execução. O envelhecimento deve ser implementado **dentro do escalonador**.
* Ao ser criada, cada tarefa recebe a prioridade default (0).
Sua implementação deve funcionar com {{pingpong-scheduler.c|este código}}. A saída da execução deve ser **similar** a {{pingpong-scheduler.txt|este exemplo}} (pequenos desvios são aceitáveis).
No exemplo acima, observe que a tarefa ''pang'' executa com mais frequência que ''peng'', esta executa com mais frequência que ''ping'' e assim sucessivamente. Isso mostra claramente a influência das prioridades das tarefas no escalonamento.
===== Outras informações =====
* Duração estimada: 3 horas.
* Dependências:
* [[Gestão de Tarefas]]
* [[Dispatcher]]