Simulador de Escalonamento de Processos
Publicado por Carlos Eduardo Lino 19/07/2008
[ Hits: 49.433 ]
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");
}
Jogo da Velha com IA invencivel
Derrubando SyGate Profissional Firewall !
[GAME-2] Acerte os rortões nas janelas (jogo com gráficos)
IA Turbina o Desktop Linux enquanto distros renovam forças
Como extrair chaves TOTP 2FA a partir de QRCODE (Google Authenticator)
Linux em 2025: Segurança prática para o usuário
Desktop Linux em alta: novos apps, distros e privacidade marcam o sábado
IA chega ao desktop e impulsiona produtividade no mundo Linux
Atualizando o Fedora 42 para 43
Como saber se o seu e-mail já teve a senha vazada?
Como descobrir se a sua senha já foi vazada na internet?
Mint Xfce não mantém a conexão no wi-fi (2)
Problemas com Driver NVIDIA (5)
Warcraft II Remastered no Linux? (8)









