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 [2023/03/29 13:56] – 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]] | ||