Simulador de Escalonamento de Processos
Publicado por Carlos Eduardo Lino 19/07/2008
[ Hits: 49.293 ]
Neste script o código é idêntico ao que vimos em SO na teoria; espero que vocês gostem.
Simulação de Processos por Prioridade
Obs: O processo de menor valor de prioridade obtém prioridade maior na fila de processos.
*Escalonamento Round-Robin
*Escalonamento SJF
*Escalonamento FCFS - o primeiro que chega é o primeiro a sair, ou seja, será executado primeiro.
/* CARLOS EDUARDO LINO UNIVERSIDADE PRESIDENTE ANTÔNIO CARLOS SISTEMAS DE INFORMAÇÃO 6ª período */ /* Simulador de Escalonamento de Processos*/ #include <stdio.h> #include <stdlib.h> /* Estrutura */ struct processos { int id; /* Identifição do processo*/ int surto; /* Tempo de duração do processo*/ int prioridade; int execucao; /* Tempo de execução do processo*/ int espera; /* Tempo de espera do processo*/ struct processos *prox; }; /* Declarações de Protótipo de função */ struct processos *init_processos (int id, int surto, int prioridade); void fcfs (struct processos *proc); void listprocs (struct processos *proc); void prioridade (struct processos *proc); void rr (struct processos *proc, int quantum); void sjf (struct processos *proc); int main (void) { struct processos *plist, *ptmp; plist = init_processos(1, 10, 3); plist->prox = init_processos(2, 1, 1); ptmp = plist->prox; ptmp->prox = init_processos(3, 2, 3); ptmp = ptmp->prox; ptmp->prox = init_processos(4, 1, 4); ptmp = ptmp->prox; ptmp->prox = init_processos(5, 5, 2); /* Simulações executadas*/ listprocs(plist); fcfs(plist); sjf(plist); prioridade(plist); rr(plist,0); while (plist != NULL) { ptmp = plist; plist = plist->prox; free(ptmp); }; return(0); }; /* Inicialização de entrada da lista de processos*/ struct processos *init_processos (int id, int surto, int prioridade) { struct processos *proc; proc = (struct processos*)malloc(sizeof(struct processos)); if (proc == NULL) { printf("Erro Fatal: Falha Alocacao de memoria.\nFinalizar.\n"); exit(1); }; proc->id = id; proc->surto = surto; proc->prioridade = prioridade; proc->execucao = 0; proc->espera = 0; proc->prox = NULL; return(proc); }; /* Escalonamento FCFS - o primeiro que chega /* é o primeiro a sair, ou seja, será executado primeiro */ void fcfs (struct processos *proc) { int tempo = 0, inicio, fim; struct processos *tmp = proc; printf("\tEscalonamento FCFS\n"); printf("\n"); while (tmp != NULL) { inicio = tempo; tempo += tmp->surto; fim = tempo; printf("Processo: %d\tSurto: %d\tEspera: %d\tRetorno: %d\n", tmp->id, tempo, inicio, fim); tmp = tmp->prox; }; printf("\n\n"); }; /* Listando Processos */ void listprocs (struct processos *proc) { struct processos *tmp = proc; printf("\tListagem de Processos\n"); printf("\n"); while (tmp != NULL) { printf("Processo: %d\tPrioridade: %d\tSurto: %d\n", tmp->id, tmp->prioridade, tmp->surto); tmp = tmp->prox; }; printf("\n\n"); }; /* Simulação de Processos por Prioridade * Obs: O processo de menor valor de prioridade obtem * prioridade maior na fila de processos */ void prioridade (struct processos *proc) { int tempo, inicio, fim, maior; struct processos *copia, *tmpsrc, *tmp, *maiorprimeiro; printf("\tEscalonamento por Prioridade\n"); printf("\n"); /* Replicando Lista de Processos */ tmpsrc = proc; copia = tmp = NULL; while (tmpsrc != NULL) { if (copia == NULL) { copia = init_processos(tmpsrc->id, tmpsrc->surto, tmpsrc->prioridade); tmp = copia; } else { tmp->prox = init_processos(tmpsrc->id, tmpsrc->surto, tmpsrc->prioridade); tmp = tmp->prox; }; tmpsrc = tmpsrc->prox; }; /* Programa Principal */ tempo = 0; while (copia != NULL) { /* Localiza o proximo processo */ maiorprimeiro = NULL; maior = copia->prioridade; tmp = copia->prox; tmpsrc = copia; while (tmp != NULL) { if (tmp->prioridade < maior) { maior = tmp->prioridade; maiorprimeiro = tmpsrc; }; tmpsrc = tmp; tmp = tmp->prox; }; if (maiorprimeiro == NULL) { /* Verifica se o primeiro processo possui maior prioridade */ inicio = tempo; tempo += copia->surto; fim = tempo; printf("Processo: %d\tSurto: %d\tEspera: %d\tRetorno: %d\n", copia->id, tempo, inicio, fim); tmpsrc = copia->prox; free(copia); copia = tmpsrc; } else { /* Verifica se o primeiro processo não possui maior prioridade */ tmp = maiorprimeiro->prox; inicio = tempo; tempo += tmp->surto; fim = tempo; printf("Processo: %d\tSurto: %d\tEspera: %d\tRetorno: %d\n", tmp->id, tempo, inicio, fim); maiorprimeiro->prox = tmp->prox; free(tmp); }; }; printf("\n\n"); }; /* Escalonamento Round-Robin */ void rr (struct processos *proc, int quantum) { int jobsremain, passes; struct processos *copia, *tmpsrc, *tmp, *slot; printf("\tEscalonamento Round-Robin - Quantum: %d)\n", quantum); printf("\n"); tmpsrc = proc; copia = tmp = NULL; while (tmpsrc != NULL) { if (copia == NULL) { copia = init_processos(tmpsrc->id, tmpsrc->surto, tmpsrc->prioridade); tmp = copia; } else { tmp->prox = init_processos(tmpsrc->id, tmpsrc->surto, tmpsrc->prioridade); tmp = tmp->prox; }; tmpsrc = tmpsrc->prox; }; /* Programa rotina de análise de prioridade */ jobsremain = 2; slot = NULL; while (jobsremain) { jobsremain = 0; /* Seleciona o próximo processo efetuando sua alocação */ if (slot == NULL) { slot = copia; jobsremain = 2; } else { passes = 0; do { if (slot->prox == NULL) { passes++; slot = copia; } else { slot = slot->prox; }; } while (passes <= 3 && slot->surto == slot->execucao); if (passes <= 3) { jobsremain = 2; }; }; /* Executa um ciclo */ tmp = copia; while (tmp != NULL) { if (tmp->surto > tmp->execucao) { if (tmp == slot) { tmp->execucao += quantum; } else { tmp->espera += quantum; }; }; tmp = tmp->prox; }; }; /* Exibe os resultados e elimina as replicações */ tmp = copia; while (tmp != NULL) { printf("Processo: %d\tSurto: %d\tEspera: %d\tRetorno: %d\n", tmp->id, tmp->surto, tmp->espera, tmp->execucao + tmp->espera); tmpsrc = tmp; tmp = tmp->prox; free(tmpsrc); }; printf("\n"); }; /* Escalonamento SJF*/ void sjf (struct processos *proc) { int tempo, inicio, fim, shortest; struct processos *copia, *tmpsrc, *tmp, *beforeshortest; printf("\tEscalonamento SJF\n"); printf("\n"); /* Lista de processos é replicada */ tmpsrc = proc; copia = tmp = NULL; while (tmpsrc != NULL) { if (copia == NULL) { copia = init_processos(tmpsrc->id, tmpsrc->surto, tmpsrc->prioridade); tmp = copia; } else { tmp->prox = init_processos(tmpsrc->id, tmpsrc->surto, tmpsrc->prioridade); tmp = tmp->prox; }; tmpsrc = tmpsrc->prox; }; tempo = 0; while (copia != NULL) { /* Encontra o proximo processo*/ beforeshortest = NULL; shortest = copia->surto; tmp = copia->prox; tmpsrc = copia; while (tmp != NULL) { if (tmp->surto < shortest) { shortest = tmp->surto; beforeshortest = tmpsrc; }; tmpsrc = tmp; tmp = tmp->prox; }; /* Executa processo e remove ráplica da lista de processos */ if (beforeshortest == NULL) { /* Aloca o primeiro processo caso o mesmo seja menor */ inicio = tempo; tempo += copia->surto; fim = tempo; printf("Processo: %d\tSurto: %d\tEspera: %d\tRetorno: %d\n", copia->id, tempo, inicio, fim); tmpsrc = copia; copia = copia->prox; free(tmpsrc); } else { /* Aloca o primeiro processo caso não haja ocorrencia de outro menor */ tmp = beforeshortest->prox; inicio = tempo; tempo += tmp->surto; fim = tempo; printf("Processo: %d\tSurto: %d\tEspera: %d\tRetorno: %d\n", tmp->id, tempo, inicio, fim); beforeshortest->prox = tmp->prox; free(tmp); } } printf("\n\n\n\tAperte qualquer tecla para execultar o escalonamento RR\n\n\n"); printf("\n"); system ("pause"); }
Cálculo de logaritmo de um número por Método de Newton-Raphson em C
Listando processos via /proc/PID
Aprenda a Gerenciar Permissões de Arquivos no Linux
Como transformar um áudio em vídeo com efeito de forma de onda (wave form)
Como aprovar Pull Requests em seu repositório Github via linha de comando
Visualizar arquivos em formato markdown (ex.: README.md) pelo terminal
Dando - teoricamente - um gás no Gnome-Shell do Arch Linux
Como instalar o Google Cloud CLI no Ubuntu/Debian
Mantenha seu Sistema Leve e Rápido com a Limpeza do APT!
Procurando vídeos de YouTube pelo terminal e assistindo via mpv (2025)
Alguém já usou o framework Avalonia para desenvolver interfaces de usu... (4)
Ajuda Pra Melhoria do NFTABLES. (8)
Sinto uma leve lentidão ao arrastar, miniminizar e restauras as janela... (2)
Pastas da raiz foram para a área de trabalho [RESOLVIDO] (7)