Chamada task_sleep

Video deste projeto

A chamada de sistema sleep(t), usada por tarefas de alguns dos projetos anteriores, é uma chamada de sistema UNIX que suspende o processo por t segundos. Como nossas threads são implementadas dentro de um processo UNIX, em um modelo N:1, todas as threads seriam suspensas juntas.

O objetivo deste projeto é criar uma função task_sleep, que faz com que somente a tarefa corrente fique suspensa durante o intervalo indicado (tempo em milissegundos), sem perturbar a execução das demais tarefas:

void task_sleep (int t)
O tempo 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 retira a tarefa solicitante da fila de prontas, a coloca na fila de tarefas adormecidas, calcula o instante em que essa tarefa deverá ser acordada e devolve o controle ao dispatcher;
  • Periodicamente, o dispatcher deve percorrer a fila de tarefas adormecidas e devolver à fila de prontas aquelas que já podem “acordar”.
  • Use o controle de preempção para evitar condições de disputa na manipulação da fila de tarefas dormindo.
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 a partir do 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.

  • so/sleeping.txt
  • Última modificação: 2020/08/01 16:41
  • por maziero