Created
July 19, 2017 22:13
-
-
Save brun0xff/816a14eff3cb85e427fb7f7c070deb61 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
#include <iostream> | |
using namespace std; | |
typedef struct elem{ | |
int pid; | |
int ing; | |
int nig; | |
int dur; | |
int esp; | |
int pwt; | |
int end; | |
elem * next; | |
}tipoProc; | |
typedef struct l{ | |
tipoProc * ini; | |
tipoProc * end; | |
}tipoList; | |
int QUANTUM; | |
int pid; | |
tipoList * lc = (tipoList *) malloc(sizeof(tipoList)); | |
int GLOBAL_TIME = 0; | |
float MEXEC = 0.0; | |
float MESPE = 0.0; | |
void print_list() | |
{ | |
tipoProc * l = lc->ini; | |
int flag = 1; | |
if(l == NULL) | |
{ | |
printf("NULL\n"); | |
return; | |
} | |
while(l and flag) | |
{ | |
if(l == lc->end) flag = 0; | |
printf("PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end); | |
l = l->next; | |
} | |
printf("\n"); | |
} | |
void round_robin() | |
{ | |
// printf("ini\n"); | |
// print_list(); | |
// printf("fim\n"); | |
tipoProc * l = lc->ini; | |
GLOBAL_TIME = l->ing; /* tempo começa no instante que o primeiro cara chega */ | |
// for(int j = 0; j < 15; j++) | |
while(l) | |
{ | |
// printf("dentro ini\n"); | |
// print_list(); | |
// printf("dentro fim\n"); | |
// printf("instancia %d\n", j); | |
if(l->dur < QUANTUM) /* processa finaliza menor que quantum */ | |
{ | |
// printf("< PID: %d, ing:%d, dur:%d\n", l->pid, l->ing, l->dur); | |
// printf("P%d DURACAO %d < QUANTUM\n", l->pid, l->dur); | |
if(l->nig > GLOBAL_TIME) | |
{ | |
GLOBAL_TIME = l->nig + l->dur + QUANTUM; | |
} | |
else | |
{ | |
GLOBAL_TIME += l->dur; | |
} | |
l->dur = 0; | |
l->end = GLOBAL_TIME; /* tempo em que o processo finaliza */ | |
printf("P%d ", l->pid); | |
MEXEC += l->end + l->ing; | |
// printf("GLOBAL_TIME===%d\n", GLOBAL_TIME); | |
// printf("ESSA LISTA\n"); | |
// print_list(); | |
// printf("FIM DA LISTA\n"); | |
// print_list(); | |
// l deve ser adiciona na lista de finalizados BEM AQUI | |
// printf("***** antes -- DEMON ****\n"); | |
// print_list(); | |
// printf("----\n"); | |
// printf("CORRENTE -- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end); | |
l = lc->ini->next; | |
lc->ini = l; | |
// printf("nova lista\n"); | |
// print_list(); | |
if(lc->ini == lc->end) | |
{ | |
// | |
if(l->nig > GLOBAL_TIME) | |
{ | |
GLOBAL_TIME = l->nig + l->dur + QUANTUM; | |
} | |
else | |
{ | |
GLOBAL_TIME += l->dur; | |
} | |
l->dur = 0; | |
l->end = GLOBAL_TIME; /* tempo em que o processo finaliza */ | |
printf("P%d ", l->pid); | |
// MEXEC += l->end + l->ing; | |
break; | |
} | |
// printf("***** DEMON ****\n"); | |
// print_list(); | |
// printf("----\n"); | |
// remove l da lista -- colocar na lista de finalizados | |
// atualiza lc | |
// l = lc | |
// printf("entrou no 1 if\n"); | |
continue; | |
} | |
else if(l->dur == QUANTUM) /* processa finaliza igual quantum */ | |
{ | |
// printf("== PID: %d, ing:%d, dur:%d\n", l->pid, l->ing, l->dur); | |
// printf("P%d DURACAO %d == QUANTUM\n", l->pid, l->dur); | |
l->dur -= QUANTUM; | |
/* checa se o processo finalizou */ | |
if(l->dur == 0) | |
{ | |
if(l->nig > GLOBAL_TIME) | |
{ | |
GLOBAL_TIME = l->nig + l->dur + QUANTUM; // tirei o quantum coloca de novo | |
} | |
else | |
{ | |
GLOBAL_TIME += QUANTUM; | |
} | |
l->end = GLOBAL_TIME; /* tempo em que o processo finaliza */ | |
printf("P%d ", l->pid); | |
MEXEC += l->end + l->ing; | |
// printf("GLOBAL_TIME===%d\n", GLOBAL_TIME); | |
// printf("ESSA LISTA\n"); | |
// print_list(); | |
// printf("FIM DA LISTA\n"); | |
// l deve ser adiciona na lista de finalizados BEM AQUI | |
// if(lc->ini == lc->end) | |
// { | |
// l = NULL; | |
// break; | |
// } | |
// printf("CORRENTE -- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end); | |
l = lc->ini->next; | |
lc->ini = l; | |
// printf("nova lista\n"); | |
// print_list(); | |
// printf("----\n"); | |
// print_list(); | |
// printf("----\n"); | |
// printf("entrou no 2 if\n"); | |
continue; | |
} | |
} | |
else /* processo volta pra lista */ | |
{ | |
printf("P%d ", l->pid); | |
if(l->nig > GLOBAL_TIME) | |
{ | |
GLOBAL_TIME = l->nig + QUANTUM; | |
} | |
else | |
{ | |
GLOBAL_TIME += QUANTUM; | |
} | |
// printf("--- GLOBAL_TIME==%d\n", GLOBAL_TIME); | |
// printf("PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end); | |
l->nig += QUANTUM; | |
l->dur -= QUANTUM; | |
// printf("PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end); | |
// printf("GLOBAL_TIME===%d\n", GLOBAL_TIME); | |
// readiciona processo na lista | |
tipoProc * caminha = lc->ini; | |
tipoProc * ante = lc->end; | |
int flag = 1; | |
// printf("PERDIDA\n"); | |
// print_list(); // taok ate aqui | |
// printf("PERDIDA\n"); | |
//remove cara da lista | |
while(caminha and flag) | |
{ | |
if(caminha == lc->end) flag = 0; | |
if(caminha == l) | |
{ | |
if(caminha == lc->ini) | |
{ | |
// printf("1\n"); | |
if(caminha == lc->end) | |
{ | |
lc->ini = NULL; | |
lc->end = NULL; | |
// printf("broderoooooo\n"); | |
// printf("CARA --- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end); | |
break; | |
} | |
// l continua apontando para o mesmo lugar | |
lc->ini = caminha->next; | |
lc->end->next = lc->ini; | |
// print_list(); | |
break; | |
} | |
else if(caminha == lc->end) | |
{ | |
// printf("2\n"); | |
// ta no fim | |
ante->next = lc->ini; | |
lc->end = ante; | |
break; | |
} | |
else | |
{ | |
// printf("3\n"); | |
// ta no meio | |
ante->next = caminha->next; | |
break; | |
} | |
} | |
ante = caminha; | |
caminha = caminha->next; | |
} | |
//remove cara da lista | |
caminha = lc->ini; | |
ante = lc->end; | |
flag = 1; | |
// printf("CHEGAR AQUIIIIII\n"); | |
// print_list(); | |
// printf("CARA --- PID: %d, nig:%d, ing:%d, dur:%d, end:%d\n", l->pid, l->nig, l->ing, l->dur, l->end); | |
// printf("lc-ini-pid=%d\n", lc->ini->pid); | |
// printf("lc-end-pid=%d\n", lc->end->pid); | |
if(lc->ini == NULL and lc->end == NULL) | |
{ | |
lc->ini = l; | |
lc->end = l; | |
lc->end->next = l; | |
continue; | |
} | |
// add cara na lista | |
while(caminha and flag) | |
{ | |
if(caminha == lc->end) flag = 0; | |
if(l->nig < caminha->nig) | |
{ | |
// vai antes | |
if(caminha == lc->ini) // e o primeiro elemento | |
{ | |
// printf("A\n"); | |
// print_list(); | |
// printf("caminha->pid=%d\n", caminha->pid); | |
// printf("lc->ini->pid=%d\n", lc->ini->pid); | |
// printf("lc->end->pid=%d\n", lc->end->pid); | |
// printf("l->pid%d\n", l->pid); | |
l->next = caminha; | |
lc->ini = l; | |
lc->end->next = l; | |
l = lc->ini; // continuar no while | |
// printf("**************** \n"); | |
// print_list(); | |
// printf("**************** \n"); | |
break; | |
} | |
else // ta no meio da lista | |
{ | |
// printf("B\n"); | |
ante->next = l; | |
l->next = caminha; | |
l = lc->ini; // continuar no while | |
break; | |
} | |
} | |
else if(caminha == lc->end) // e igual ou maior, vai depois | |
{ | |
// printf("C\n"); | |
// vai depois | |
// e o ultimo elemento | |
// ta no final | |
caminha->next = l; | |
l->next = lc->ini; | |
lc->end = l; | |
l = lc->ini; // continuar no while | |
break; | |
} | |
ante = caminha; | |
caminha = caminha->next; | |
} | |
} | |
// printf("a lista\n"); | |
// print_list(); | |
} | |
} | |
void add_elem_lis(int ing, int dur) | |
{ | |
tipoProc * elem = (tipoProc *) malloc(sizeof(tipoProc)); | |
elem->pid = pid++; | |
elem->ing = ing; | |
elem->dur = dur; | |
elem->esp = 0; | |
elem->nig = ing; | |
elem->end = -1; | |
if(lc->ini == NULL) /* list esta vazia */ | |
{ | |
lc->ini = elem; | |
lc->end = elem; | |
elem->next = elem; | |
} | |
else | |
{ | |
lc->end->next = elem; | |
lc->end = elem; | |
elem->next = lc->ini; | |
} | |
} | |
void create_list() | |
{ | |
lc->ini = NULL; | |
lc->end = NULL; | |
} | |
void free_list() | |
{ | |
tipoProc * l = lc->ini; | |
tipoProc * aux; | |
int flag = 1; | |
while(l and flag) | |
{ | |
if(l == lc->end) flag = 0; | |
aux = l; | |
l = l->next; | |
free(l); | |
} | |
lc->ini = NULL; | |
lc->end = NULL; | |
} | |
int main(int argc, char const *argv[]) | |
{ | |
int m, n, ing, dur, ts = 1; | |
create_list(); /* cria lc -- lista circular que contem processsos */ | |
cin >> m; | |
QUANTUM = m; | |
pid = 1; | |
while(cin >> n and n) | |
{ | |
printf("\nTeste %d\n", ts); | |
for(int i=0; i<n; i++) | |
{ | |
cin >> ing >> dur; | |
add_elem_lis(ing, dur); | |
} | |
// print_list(); | |
round_robin(); | |
printf("\nTempo medio de execucao: %.2f\n", (MEXEC/(pid-1))); | |
printf("Tempo medio de espera: %.2f\n", MESPE); | |
free_list(); | |
pid = 1; | |
ts++; | |
} | |
return 0; | |
} |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment