Este projeto foi desenvolvido no âmbito da cadeira de Sistemas Operativos.
bin/: Binários resultantes da compilação.src/: Código fonte do projeto.controller/: Lógica do servidor central que gere a fila de tarefas.runner/: Cliente que submete tarefas e as executa após autorização.
include/: Ficheiros de cabeçalho (.h).obj/: Ficheiros objeto (.o).tmp/: Localização dos FIFOs e ficheiros temporários.
Para compilar o projeto, basta executar o comando make na raíz do repositório:
makeIsto irá criar os diretórios necessários (bin, obj, tmp) e compilar os binários controller e runner.
Para limpar os ficheiros gerados:
make cleanO sistema baseia-se num modelo cliente-servidor onde o controller deve estar a correr para que o runner possa submeter tarefas.
O controller é responsável por receber pedidos de execução, geri-los numa fila de espera e autorizar a execução com base numa política de escalonamento e num limite de paralelismo.
Uso:
./bin/controller <max_parallel> <policy><max_parallel>: Número máximo de tarefas a correr em simultâneo.<policy>: Política de escalonamento a utilizar. Opções:fcfs: First-Come, First-Served (por ordem de chegada).rr: Round Robin (atualmente implementado como alternância simples).random: Escolha aleatória da próxima tarefa.
Exemplo:
./bin/controller 3 fcfsO runner é a interface do utilizador para interagir com o sistema. Permite submeter comandos para execução, listar o estado atual ou desligar o sistema.
Executa um comando (com os seus argumentos) sob um determinado ID de utilizador.
Uso:
./bin/runner -e <user_id> "<comando> <argumentos>"Exemplo:
./bin/runner -e 1001 "ls -l /tmp"
./bin/runner -e 1001 "sleep 10"Mostra as tarefas que estão atualmente em execução ou em fila de espera.
Uso:
./bin/runner -cEnvia um sinal ao controller para terminar a sua execução de forma segura. O controller apenas desligará após concluir todas as tarefas em execução e em fila.
Uso:
./bin/runner -sTodas as tarefas concluídas são registadas no ficheiro logs/log.txt (criado automaticamente se o diretório existir). O registo inclui o ID do utilizador, o ID do comando (PID do runner que o submeteu) e a duração da execução em milissegundos.
Exemplo de log:
user-id 1001 | command-id 12345 | duration 10005 ms