Simulador de Escalonamento de Processos
Publicado por Carlos Eduardo Lino 19/07/2008
[ Hits: 49.095 ]
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"); }
Google Code Jam 2010 - Africa Classification Round
[GAME-2] Acerte os rortões nas janelas (jogo com gráficos)
[C] Listas Duplamente Encadeadas
Passkeys: A Evolução da Autenticação Digital
Instalação de distro Linux em computadores, netbooks, etc, em rede com o Clonezilla
Título: Descobrindo o IP externo da VPN no Linux
Armazenando a senha de sua carteira Bitcoin de forma segura no Linux
Enviar mensagem ao usuário trabalhando com as opções do php.ini
Instalando Brave Browser no Linux Mint 22
vídeo pra quem quer saber como funciona Proteção de Memória:
Encontre seus arquivos facilmente com o Drill
Mouse Logitech MX Ergo Advanced Wireless Trackball no Linux
Compartilhamento de Rede com samba em modo Público/Anônimo de forma simples, rápido e fácil
Programa duplicado no "Abrir com" e na barra de pesquisa do ... (1)
VMs e Interfaces de Rede desapareceram (13)
Como abrir o pycharm no linux [RESOLVIDO] (4)