====== 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)