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 [2023/03/29 15:31] – maziero | so:dispatcher [2024/07/16 17:22] (atual) – [Uso do Valgrind] 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]] | ||