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)