Tarefas dormindo

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)

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, usando task_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 neste projeto é 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 periodicamente pelo despachante.

Os seguintes arquivos são relevantes para este projeto:

  • kernel/dispatcher.c
  • kernel/taskdata.h
  • test/pingpong-sleep.c: programa de teste
  • test/pingpong-sleep.txt: saída esperada do teste

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.

  • ppos-v2/tarefas_que_dormem.txt
  • Última modificação: 2025/09/04 15:55
  • por maziero