Algoritmos de escalonamento
O objetivo deste projeto é escrever um programa para simular o escalonamento de um conjunto de tarefas usando os algoritmos de escalonamento de processador mais conhecidos. O programa deverá suportar os seguintes algoritmos:
- FCFS (First Come, First Served)
- Shortest Job First
Shortest Remaining Time First- Por prioridade, sem preempção
- Por prioridade, com preempção por prioridade
- Round-Robin com quantum = 2s, sem prioridade
Round-Robin com quantum = 5s, sem prioridade- Round-robin com prioridade e envelhecimento (tq=2, α=1)
No caso dos escalonamentos round-robin, o envelhecimento deve ocorrer a cada quantum e não há preempção por prioridade.
O programa deverá ler os dados dos processos da entrada padrão (stdin). Cada linha da entrada corresponde a um processo, com os seguintes dados fornecidos como inteiros separados por um ou mais espaços em branco:
- data de criação
- duração em segundos
- prioridade estática (escala de prioridades positiva)
Um exemplo de entrada para o simulador poderia ser:
0 5 2 0 2 3 1 4 1 3 3 4
Nesse exemplo de entrada, o processo P1 tem data de criação 0, sua execução dura 5 segundos e sua prioridade é 2. Esse formato de entrada deverá ser respeitado, pois o professor pode testar seu simulador com outros dados de entrada. Observe que essa listagem não precisa necessariamente estar ordenada por data de criação de cada processo.
Para cada algoritmo, o simulador deverá produzir as seguintes informações em sua saída padrão (stdout):
- tempo médio de vida
- tempo médio de espera
- número de trocas de contexto
- diagrama de tempo da execução
Para simplificar, o diagrama de tempo de cada execução pode ser gerado na vertical, de cima para baixo (uma linha por segundo), conforme mostra o exemplo a seguir:
tempo P1 P2 P3 P4 0- 1 ## -- 1- 2 ## -- -- 2- 3 -- ## -- 3- 4 -- ## -- -- 4- 5 -- ## -- 5- 6 -- ## -- 6- 7 ## -- -- 7- 8 ## -- -- 8- 9 -- -- ## 9-10 -- -- ## 10-11 -- ## -- 11-12 -- ## -- 12-13 ## -- 13-14 ##
Deve ser entregue ao professor o código-fonte em C do simulador, devidamente comentado.
Sugestão de implementação (pseudo-código que deve ser ajustado para cada política):
início lê dados das tarefas da entrada padrão imprime cabeçalho do diagrama t = 0 enquanto t < tmax se há uma tarefa rodando se a tarefa rodando chegou ao fim da execução migra a tarefa para o estado terminado libera o processador senão se a tarefa rodando chegou ao fim de seu quantum migra a tarefa para a fila de prontos libera o processador fim se fim se para cada tarefa i se a tarefa i inicia agora (em t) coloca a tarefa na fila de prontos fim se fim para se o processador estiver livre se houver tarefa na fila de prontas escolhe uma tarefa da fila de prontas migra essa tarefa para o estado "rodando" fim se fim se imprime linha do diagrama com o estado de cada tarefa incrementa o tempo (t++) incrementa contadores da tarefa corrente (tempo de vida e de quantum) fim enquanto calcula e imprime tempos médios fim
Sugere-se definir para cada tarefa:
- identificador
- datas de inicio e de conclusão
- duração (tempo necessário no processador)
- prioridades estática e dinâmica
- estado atual (nova, pronta, rodando, terminada, …)
- tempo já executado (total e no quantum atual)
- … (outros campos podem ser necessários para algumas políticas)