Diferenças
Aqui você vê as diferenças entre duas revisões dessa página.
Ambos lados da revisão anterior Revisão anterior Próxima revisão | Revisão anterior | ||
so:dispatcher [2019/04/22 18:54] – maziero | so:dispatcher [2024/03/25 17:40] (atual) – maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Despachante de tarefas ====== | ||
+ | |||
+ | :!: alterações na interface em 03/ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | Você irá construir um despachante de tarefas baseado em duas entidades: uma tarefa // | ||
+ | |||
+ | {{ dispatcher.png? | ||
+ | |||
+ | A seguinte chamada para a execução da tarefa atual e retorna ao // | ||
+ | |||
+ | <code c> | ||
+ | void task_yield () ; | ||
+ | </ | ||
+ | |||
+ | O que deve fazer essa função: | ||
+ | |||
+ | - coloca a tarefa atual no fim da fila de prontas | ||
+ | - muda o estado da tarefa atual para '' | ||
+ | - devolve a CPU ao despachante | ||
+ | |||
+ | <note tip> | ||
+ | Sugestão: use a função '' | ||
+ | </ | ||
+ | |||
+ | ===== Observações ===== | ||
+ | |||
+ | * O // | ||
+ | * O programa principal inicia todas as tarefas de usuário e passa o controle para a tarefa // | ||
+ | * Será necessário implementar uma fila de tarefas prontas, usando a biblioteca de filas genéricas desenvolvida anteriormente. | ||
+ | * A **política de escalonamento** será definida por uma função '' | ||
+ | * Quando uma tarefa encerrar, o controle volta ao // | ||
+ | * quando o // | ||
+ | |||
+ | O código do corpo da tarefa // | ||
+ | |||
+ | < | ||
+ | função dispatcher | ||
+ | início | ||
+ | // retira o dispatcher da fila de prontas, para evitar que ele ative a si próprio | ||
+ | | ||
+ | |||
+ | // enquanto houverem tarefas de usuário | ||
+ | | ||
+ | |||
+ | // 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 | ||
+ | | ||
+ | |||
+ | // voltando ao dispatcher, trata a tarefa de acordo com seu estado | ||
+ | caso o estado da tarefa " | ||
+ | PRONTA | ||
+ | TERMINADA : ... | ||
+ | SUSPENSA | ||
+ | (etc) | ||
+ | fim caso | ||
+ | |||
+ | fim se | ||
+ | |||
+ | fim enquanto | ||
+ | |||
+ | // encerra a tarefa dispatcher | ||
+ | | ||
+ | fim | ||
+ | </ | ||
+ | |||
+ | Sua implementação deve funcionar com {{pingpong-dispatcher.c|este código}}. A saída da execução deve ser igual a {{pingpong-dispatcher.txt|este exemplo}}. | ||
+ | |||
+ | ===== Outras informações ===== | ||
+ | |||
+ | * Duração estimada: 5 horas. | ||
+ | * Dependências: | ||
+ | * [[Biblioteca de Filas]] | ||
+ | * [[Gestão de Tarefas]] | ||