Ferramentas do usuário

Ferramentas do site


so:dispatcher

Despachante de tarefas

Você irá construir um despachante de tarefas baseado em duas entidades: uma tarefa dispatcher, responsável pelo controle geral, e uma função scheduler, responsável por determinar qual a próxima tarefa a executar a cada troca de contexto. A figura abaixo ilustra o funcionamento geral do sistema:

A seguinte chamada permite a uma tarefa voltar ao final da fila de prontas, devolvendo o processador ao dispatcher:

void task_yield () ;

Sugestão: use a função task_switch() para implementar task_yield().

Observações

  • O dispatcher deve ser implementado como uma tarefa, a ser criada usando a chamada task_create durante a inicialização do sistema (execução de ppos_init).
  • O programa principal cria todas as tarefas de usuário e passa o controle para a tarefa dispatcher, que só encerra quando não existirem mais tarefas de usuário a executar.
  • Será necessário implementar uma fila de tarefas prontas, usando a biblioteca de filas genéricas desenvolvida anteriormente.
  • Quando uma tarefa encerra (usando task_exit), o controle volta ao dispatcher e este libera as estruturas de dados usadas pela tarefa.
  • A política de escalonamento será definida por uma função scheduler(), chamada pelo dispatcher para decidir qual a próxima tarefa a ativar. Neste projeto, deve ser implementada uma política FCFS.

O código do corpo da tarefa dispatcher deve seguir +/- o seguinte modelo (simplificado):

função dispatcher
início
   // enquanto houverem tarefas de usuário
   enquanto ( userTasks > 0 )

      // escolhe a próxima tarefa a executar
      próxima = scheduler()

      // escalonador escolheu uma tarefa?      
      se próxima <> NULO então

         // transfere controle para a próxima tarefa
         task_switch (próxima)
         
         // voltando ao dispatcher, trata a tarefa de acordo com seu estado
         caso o estado da tarefa "próxima" seja:
            PRONTA    : ...
            TERMINADA : ...
            SUSPENSA  :
            (etc)
         fim caso         

      fim se

   fim enquanto

   // encerra a tarefa dispatcher
   task_exit(0)
fim

Sua implementação deve funcionar com este código. A saída da execução deve ser igual a este exemplo.

Outras informações

so/dispatcher.txt · Última modificação: 2019/04/29 19:07 por maziero