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:gestao_de_tarefas [2021/04/20 10:39] – maziero | so:gestao_de_tarefas [2024/02/14 11:30] (atual) – maziero | ||
---|---|---|---|
Linha 1: | Linha 1: | ||
+ | ====== Gestão de Tarefas ====== | ||
+ | |||
+ | :!: alterações na interface em 03/ | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | **Objetivo**: | ||
+ | |||
+ | ===== Descritor de tarefa ===== | ||
+ | |||
+ | Cada tarefa existente no sistema deve ter uma estrutura que a representa, ou seja, um descritor de tarefa (//TCB - Task Control Block//). O tipo dessa estrutura deve ser definido no arquivo '' | ||
+ | |||
+ | <code c> | ||
+ | typedef struct task_t | ||
+ | { | ||
+ | | ||
+ | int tid ; // task ID, identificador da tarefa | ||
+ | int status ; // pronta, executando, terminada, ... | ||
+ | | ||
+ | } task_t ; | ||
+ | </ | ||
+ | |||
+ | ===== Interface ===== | ||
+ | |||
+ | As seguintes funções devem ser implementadas: | ||
+ | |||
+ | === Inicializa o sistema === | ||
+ | |||
+ | <code c> | ||
+ | void ppos_init () | ||
+ | </ | ||
+ | |||
+ | Esta função inicializa as estruturas internas do SO. Por enquanto, conterá apenas algumas inicializações de variáveis e a seguinte instrução, | ||
+ | |||
+ | <code c> | ||
+ | /* desativa o buffer da saida padrao (stdout), usado pela função printf */ | ||
+ | setvbuf (stdout, 0, _IONBF, 0) ; | ||
+ | </ | ||
+ | |||
+ | === Inicia uma nova tarefa === | ||
+ | |||
+ | <code c> | ||
+ | int task_init (task_t *task, void (*start_routine)(void *), void *arg) | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | * '' | ||
+ | * '' | ||
+ | * retorno: o ID (>0) da nova tarefa ou um valor negativo, se houver erro | ||
+ | |||
+ | Atenção: deve ser previsto um descritor de tarefa que aponte para o programa principal (que exercerá a mesma função da variável '' | ||
+ | |||
+ | === Transfere o processador para outra tarefa === | ||
+ | |||
+ | <code c> | ||
+ | int task_switch (task_t *task) | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | * retorno: valor negativo se houver erro, ou zero | ||
+ | |||
+ | Esta é a operação básica de troca de contexto, que encapsula a função '' | ||
+ | |||
+ | === Termina a tarefa corrente === | ||
+ | |||
+ | {{ : | ||
+ | |||
+ | <code c> | ||
+ | void task_exit (int exit_code) | ||
+ | </ | ||
+ | |||
+ | * '' | ||
+ | |||
+ | Neste projeto, quando uma tarefa encerra, o controle deve retornar à tarefa '' | ||
+ | |||
+ | === Informa o identificador da tarefa corrente === | ||
+ | |||
+ | <code c> | ||
+ | int task_id () | ||
+ | </ | ||
+ | |||
+ | * retorno: Identificador numérico (ID) da tarefa corrente, que deverá ser 0 para '' | ||
+ | |||
+ | ===== Observações ===== | ||
+ | |||
+ | A implementação completa deste projeto compreende definir os tipos e estruturas de dados necessários para gerenciar as tarefas e implementar as funções acima descritas, comentando detalhadamente o código. | ||
+ | |||
+ | A convenção de estruturação de código em C deverá ser respeitada: | ||
+ | |||
+ | * '' | ||
+ | * constantes e macros globais | ||
+ | * definições dos tipos e estruturas de dados globais | ||
+ | * '' | ||
+ | * protótipos das funções públicas | ||
+ | * '' | ||
+ | * constantes e macros internas | ||
+ | * definições dos tipos e estruturas de dados internas | ||
+ | * funções internas | ||
+ | * implementações das funções públicas | ||
+ | |||
+ | <note important> | ||
+ | Capriche na implementação, | ||
+ | </ | ||
+ | |||
+ | ===== Validação ===== | ||
+ | |||
+ | Seu código deve funcionar adequadamente com os programas de teste abaixo indicados, fornecendo as saídas esperadas: | ||
+ | |||
+ | * {{pingpong-tasks1.c|programa de teste 1}} e sua {{pingpong-tasks1.txt|saída esperada}} | ||
+ | * {{pingpong-tasks2.c|programa de teste 2}} e sua {{pingpong-tasks2.txt|saída esperada}} | ||
+ | * {{pingpong-tasks3.c|programa de teste 3}} e sua {{pingpong-tasks3.txt|saída esperada}} | ||
+ | |||
+ | <note tip> | ||
+ | O primeiro programa de teste corresponde ao código {{contexts.c}} do projeto anterior, reescrito com as novas funções. Comparar os dois códigos pode ajudar a compreender o que deve ser implementado em cada função. | ||
+ | </ | ||
+ | |||
+ | Compile da seguinte forma: | ||
+ | |||
+ | < | ||
+ | $ cc -Wall ppos_core.c pingpong-tasks1.c | ||
+ | </ | ||
+ | |||
+ | Se desejar mais detalhes da compilação, | ||
+ | |||
+ | < | ||
+ | $ cc -Wextra ppos_core.c pingpong-tasks1.c | ||
+ | </ | ||
+ | |||
+ | ===== Depuração ===== | ||
+ | |||
+ | Todas as funções implementadas devem gerar mensagens de depuração, | ||
+ | |||
+ | < | ||
+ | task_init: iniciada tarefa 23 | ||
+ | task_switch: | ||
+ | task_exit: tarefa 23 sendo encerrada | ||
+ | ... | ||
+ | </ | ||
+ | |||
+ | Essas mensagens de depuração somente deverão ser geradas se a contante global '' | ||
+ | |||
+ | <code c> | ||
+ | #ifdef DEBUG | ||
+ | printf (" | ||
+ | #endif | ||
+ | </ | ||
+ | |||
+ | A constante '' | ||
+ | |||
+ | <code c> | ||
+ | #define DEBUG | ||
+ | </ | ||
+ | |||
+ | ou na linha de comando, no momento da compilação: | ||
+ | |||
+ | < | ||
+ | $ cc -Wall -o teste -DDEBUG ppos_core.c pingpong-tasks1.c | ||
+ | </ | ||
+ | |||
+ | ===== Outras informações ===== | ||
+ | |||
+ | * Duração estimada: 4 horas. | ||
+ | * Dependências: | ||
+ | * [[Trocas de contexto]] | ||