Diferenças

Aqui você vê as diferenças entre duas revisões dessa página.

Link para esta página de comparações

Ambos lados da revisão anterior Revisão anterior
Próxima revisão
Revisão anterior
so:tarefas_dormindo [2023/03/29 18:04] mazieroso:tarefas_dormindo [2024/02/14 11:38] (atual) maziero
Linha 1: Linha 1:
 +====== Tarefas dormindo ======
 +
 +:!: alterações na interface em 03/2023
 +
 +{{ :so:ppos_09_sleep.mkv |Video deste projeto}}
 +
 +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:
 +
 +<code c>
 +void task_sleep (int t)
 +</code>
 +
 +<note important>
 +O tempo solicitado em ''task_sleep'' é expresso em **milissegundos**.
 +</note>
 +
 +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.
 +
 +<note warning>
 +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**. 
 +</note>
 +
 +Sua implementação deve funcionar com {{pingpong-sleep.c|este código}} e gerar uma saída **similar** a {{pingpong-sleep.txt|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:
 +    * [[Gestão de Tarefas]]
 +    * [[Dispatcher]]
 +    * [[Preempção por Tempo]]
 +    * [[Tarefas suspensas]]