Esses dias estive quebrando a cabeça para implementar gestão de tarefas utilizando contexto. Código aqui.
Como tudo nesse projeto, essa foi mais uma "task" do conteúdo do professor Maziero.
Sobre a implementação:
Foi implementado um sistema de gerenciamento de tarefas usando contextos do sistema. Ele gerencia tarefas cooperativas executando uma tarefa até passar explicitamente para outra.
Estrutura task_t
: Representa uma tarefa, armazenando o contexto de execução, um identificador (ID), e ponteiros para facilitar a construção de uma fila duplamente encadeada de tarefas.
typedef struct task_t
{
struct task_t *prev, *next; // ponteiros para usar em filas
int id; // identificador da tarefa
ucontext_t context; // contexto armazenado da tarefa
short status; // pronta, rodando, suspensa, ...
// ... (outros campos serão adicionados mais tarde)
} task_t;
Inicialização: A função ppos_init()
é chamada para configurar o contexto principal do programa. Isso prepara o sistema para gerenciar múltiplas tarefas.
Criação de tarefas: Novas tarefas são criadas com task_init()
, onde você passa uma função e argumentos para ser executada dentro da nova tarefa. Essas tarefas recebem um novo contexto e pilha, e o ID da tarefa é atualizado.
Mudança de contexto: A função task_switch()
permite alternar entre tarefas, trocando o contexto atual pelo de uma tarefa especificada.
Finalização de tarefa: Uma tarefa pode encerrar sua execução e retornar ao contexto principal com task_exit()
.