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 21:54] – maziero | so:dispatcher [2025/08/28 15:55] (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}}. | ||
| + | |||
| + | ===== Uso do Valgrind ===== | ||
| + | |||
| + | O [[https:// | ||
| + | |||
| + | Para poder usar o Valgrind corretamente neste projeto, deve-se informar ao Valgrind que estão sendo usados vários contextos com pilhas separadas. Isso é feito através de algumas alterações no código-fonte. | ||
| + | |||
| + | Primeiro, deve-se incluir o arquivo de cabeçalhos do Valgrind: | ||
| + | |||
| + | <code c> | ||
| + | #include < | ||
| + | </ | ||
| + | |||
| + | No descritor de cada tarefa, deve-se incluir um campo para uso do Valgrind: | ||
| + | |||
| + | <code c> | ||
| + | struct task_t | ||
| + | { | ||
| + | ... | ||
| + | int vg_id ; // ID da pilha da tarefa no Valgrind | ||
| + | ... | ||
| + | } | ||
| + | </ | ||
| + | |||
| + | Após a alocação da pilha de cada tarefa, deve-se **registrar** essa pilha junto ao Valgrind: | ||
| + | |||
| + | <code c> | ||
| + | // aloca a pilha da tarefa | ||
| + | task-> | ||
| + | if (!task-> | ||
| + | return (-1) ; | ||
| + | |||
| + | // registra a pilha da tarefa no Valgrind | ||
| + | task-> | ||
| + | </ | ||
| + | |||
| + | Finalmente, quando a pilha da tarefa for liberada, deve-se **desfazer o registro** dessa pilha no Valgrind: | ||
| + | |||
| + | <code c> | ||
| + | // libera a pilha da tarefa | ||
| + | free (task-> | ||
| + | |||
| + | // dezfaz o registro da pilha no Valgrind | ||
| + | VALGRIND_STACK_DEREGISTER (task-> | ||
| + | </ | ||
| + | |||
| + | Mais informações sobre essas macros e o uso avançado do Valgrind podem ser obtidas [[https:// | ||
| + | ===== Outras informações ===== | ||
| + | |||
| + | * Duração estimada: 5 horas. | ||
| + | * Dependências: | ||
| + | * [[Biblioteca de Filas]] | ||
| + | * [[Gestão de Tarefas]] | ||