Tarefas dormindo
alterações na interface em 03/2023
A chamada de sistema sleep (t)
do UNIX suspende um processo por t
segundos. O objetivo deste projeto é criar uma função task_sleep
, que faz com que a tarefa atual fique suspensa durante o intervalo indicado (tempo em milissegundos), sem perturbar a execução das demais tarefas:
void task_sleep (int t)
O tempo solicitado em
task_sleep
é expresso em milissegundos.
Para implementar essa funcionalidade é necessário:
- Criar uma fila de “tarefas adormecidas”, separada da fila de tarefas prontas;
- Escrever a função
task_sleep
, que calcula o instante em que a tarefa atual deverá ser acordada e a suspende na fila de tarefas adormecidas, usandotask_suspend
; - Periodicamente, o dispatcher deve percorrer a fila de tarefas adormecidas e reativar as tarefas que já podem acordar, usando
task_awake
. - Use o controle de preempção para evitar condições de disputa na manipulação da fila de tarefas adormecidas.
Um erro muito frequente é colocar a verificação da fila de tarefas adormecidas dentro do tratador de ticks de relógio. Não faça isso, pois esse tratador representa uma ISR - Interrupt Service Routine, que deve ser pequena e muito rápida. Implemente essa verificação como uma função ativada pelo despachante.
Sua implementação deve funcionar com este código e gerar uma saída similar a este exemplo. Na saída, observe que o campo “t=xxx
” no início de cada linha indica o instante atual, em milissegundos; verifique se os períodos de “sono” de cada tarefa estão coerentes com os valores de tempo indicados nas linhas da saída.
Outras informações
- Duração estimada: 6 horas.
- Dependências: