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
ppos-v2:tarefas_que_esperam [2026/07/29 17:38] – [Tarefas que esperam] mazieroppos-v2:tarefas_que_esperam [2026/07/29 20:46] (atual) – maziero
Linha 1: Linha 1:
 +====== Tarefas que esperam ======
 +
 +Este projeto faz parte do [[PPOS-v2:start|PPOS v2]].
 +
 +O objetivo deste projeto é construir a função ''task_wait'', que permite a uma tarefa suspender-se para esperar a conclusão de outra, de forma similar às chamadas POSIX ''wait'' e ''pthread_join'':
 +
 +<code c>
 +int task_wait(struct task_t *task)
 +</code>
 +
 +A chamada ''task_wait(b)'' faz com que a tarefa atual (corrente) seja suspensa até a conclusão da tarefa ''b''. Mais tarde, quando a tarefa ''b'' encerrar (usando a chamada ''task_exit''), a tarefa suspensa deve retornar à fila de tarefas prontas.
 +
 +Observações:
 +
 +  * Lembre-se que várias tarefas podem ficar aguardando que a tarefa ''b'' encerre, então **todas elas** têm de ser acordadas quando isso ocorrer.
 +  * Caso a tarefa ''b'' já tenha encerrado, esta chamada deve retornar imediatamente, sem suspender a tarefa atual.
 +  * O valor de retorno da chamada ''task_wait'' é o //exit code// da tarefa que encerrou (informado como parâmetro de ''task_exit'').
 +
 +<note tip>
 +**Sugestão**: crie uma fila de tarefas esperando; quando uma tarefa chamar ''task_wait'' ela é colocada nessa fila; quando uma tarefa encerra, o despachante percorre essa fila e acorda as tarefas que estiverem aguardando por ela.
 +</note>
 +
 +Para facilitar a construção deste e dos próximos projetos, deve-se usar as funções ''task_suspend'' e ''task_awake'' implementadas no projeto [[Despachante de tarefas]].
 +
 +===== Arquivos =====
 +
 +Os seguintes arquivos são relevantes para este projeto:
 +
 +  * ''kernel/dispatcher.c''
 +  * ''kernel/tcb.h''
 +  * ''kernel/task.c''
 +  * ''test/pingpong-wait.c'': teste da função ''task_wait''
 +  * ''test/pingpong-wait-stress.c'': teste de stress da função ''task_wait'' (com muitas tarefas)
 +  * ''test/pingpong-wait*.txt'': saídas esperadas dos testes
 + 
 +
 +===== Outras informações =====
 +
 +  * Duração estimada: 4 horas.
 +  * Dependências:
 +    * [[Tarefas cooperativas]]
 +    * [[Despachante de tarefas]]
 +    * [[Preempção por Tempo]]