int scheduler(int evento) { int cambia_proceso =0; int prox_proceso_a_ejecutar; prox_proceso_a_ejecutar=pars[1]; // pars[1] = proceso en ejecución if(evento==PROCESO_NUEVO) { // Agregar el nuevo proceso a la cola de listos // pars[0] es el proceso nuevo proceso[pars[0]].estado=LISTO; mete_a_cola(&listos,pars[0]); // pars[1] es el proceso en ejecución if(tiempo==0) //if (pars[1] == NINGUNO) cambia_proceso =1; } if(evento==TIMER) printf("Llega interrupcion del Timer\n"); if(evento==SOLICITA_E_S) { proceso[pars[1]].estado=BLOQUEADO; printf("Solicita E/S Proceso %d\n",pars[1]); } if(evento==TERMINA_E_S) { // Saber cual proceso terminó E/S // pars0 es el proceso desbloqueado proceso[pars[0]].estado=LISTO; prox_proceso_a_ejecutar=pars[0]; printf("Termina E/S Proceso desbloqueado %d\n",pars[0]); } if(evento==PROCESO_TERMINADO) { // pars0 = proceso terminado proceso[pars[0]].estado=TERMINADO; cambia_proceso=1; // Indíca que puede poner un proceso nuevo en ejecucion } if(cambia_proceso) { // Si la cola no esta vacia obtener de la cola el siguiente proceso listo if(!cola_vacia(listos)) { prox_proceso_a_ejecutar=sacar_de_cola(&listos); proceso[prox_proceso_a_ejecutar].estado=EJECUCION; cambia_proceso=0; } else { printf("Ho hay procesos en cola\n"); prox_proceso_a_ejecutar=NINGUNO; } } return(prox_proceso_a_ejecutar); }
void main() { void init_cola (cola **p); void ins_cola (cola **p,int objeto); void retira_cola (cola **p,int *s); int cola_vacia (cola **p); int temp [MAXIMOV],tarde [MAXIMOV], acttemp [MAXIMOA]; int acttarde [MAXIMOA],nv,nact,v,valor, actividad,aux; struct V grafo[MAXIMOV], g_invertido[MAXIMOV]; cola *cola; struct nodo *p; int topo [MAXIMOV],i,suma,mayor; int lea_grafo (V grafo[],V g_invertido[], int *nv, int *nact ); void ins_lista (V g[],int v, int ad, int act, int tiempo); void escriba_g (V g[],int nv); lea_grafo (grafo,g_invertido,&nv,&nact); escriba_g (grafo,nv); SALTO; getch(); escriba_g (g_invertido,nv); SALTO; getch(); for (i=1; i<=nv; i++) { topo [i] = 0; temp[i] = 0; } for (i=1; i <= nact; i++) { acttemp [i] = acttarde [i] = 0; } for (i=1; i <= nv; i++ ) { p = g_invertido [i].cab; while (p != NULL) { topo [i]++; p = p->sig; } } init_cola (&cola); for (i=1;i<=nv;i++) if (topo [i] == 0 ) ins_cola (&cola,i); while (!cola_vacia(&cola)) { retira_cola (&cola ,&v); p = grafo[v].cab; while (p != NULL) { aux = p->ad; valor = p->tiempo; actividad = p->act; topo [aux]--; if (topo[aux] == 0) ins_cola (&cola,aux); suma = temp[v] + valor; if (suma > temp [aux] ) temp [aux] = suma; acttemp [actividad] = temp [v]; p = p->sig; } } mayor = temp [1]; for (i=2; i <=nv; i++ ) if (mayor < temp [i]) mayor = temp[i]; for (i=1; i<=nv; i++) { topo [i] = 0; tarde [i] = mayor; } for (i=1; i <= nv; i++ ) { p = grafo [i].cab; while (p != NULL) { topo [i]++; p = p->sig; } } init_cola (&cola); for (i=1;i<=nv;i++) if (topo [i] == 0 ) ins_cola (&cola,i); while (!cola_vacia(&cola)) { retira_cola (&cola ,&v); p = g_invertido [v].cab; while (p != NULL) { aux = p->ad; valor = p->tiempo; actividad = p->act; topo [aux]--; if (topo[aux] == 0) ins_cola (&cola,aux); suma = tarde [v] - valor; if (suma < tarde [aux] ) tarde [aux] = suma; acttarde [actividad] = suma; p = p->sig; } } PR("Lo mas temprano de los eventos.."); for (i=1; i<=nv; i++) { printf ("%2d ",temp [i]); } SALTO; PR("Lo mas tarde de los eventos....."); for (i=1; i<=nv; i++) { printf ("%2d ",tarde [i]); } SALTO; PR("Lo mas temprano las actividades.."); for (i=1; i<=nact; i++) { printf ("%2d ",acttemp [i]); } SALTO; PR("Lo mas tarde de las actividades.."); for (i=1; i<=nact ; i++) { printf ("%2d ",acttarde [i]); } PR("\nRUTA CRITICA.....\n"); PR("EVENTOS.."); SALTO; for (i=1; i <= nv; i++) if (temp [i] == tarde [i]) printf ("%2d ",i); PR("\nACTIVIDADES "); SALTO; for (i=1; i <= nact; i++) if (acttemp[i] == acttarde [i]) printf ("%2d ",i); getch(); }
int scheduler(int evento) { printf(" <Scheduler>\n"); int cambia_proceso = FALSE; // bandera de cambio de proceso int prox_proceso_a_ejecutar = pars[1]; // pid del proceso en ejecucion switch(evento) { case 0: printf(" EVENTO: TIMER, ejecucion actual: %d\n",pars[0]); if(pars[1] == NINGUNO){ cambia_proceso = TRUE; break; } if(++proceso[pars[1]].num_veces >= pow(2.0, (proceso[pars[1]].prioridad)) && !(cola_vacia(listos))) { printf(" - Cola no vacia\n"); printf(" - Se llego a 2n (cambio de proceso)\n"); // lo que estaba en ejecucion se mete a listos proceso[pars[1]].estado = LISTO; push(pars[1]); // y se hace push cambia_proceso = TRUE; proceso[pars[1]].num_veces = 0; } else { printf(" - Mi prioridad es: %d \n", proceso[pars[1]].prioridad); printf(" - Me he ejecutado: %d veces\n", proceso[pars[1]].num_veces); //proceso[pars[1]].num_veces++; /* Aumentamos la cantidad de veces que se ha ejecutado*/ cambia_proceso = FALSE; /*NO CAMBIAR DE PROCESO*/ } break; /////////////////////////////////////////////// case 1: printf(" EVENTO: SOLICITA_E_S, ejecucion actual: %d\n",pars[0]); // se mete a la cola de bloqueados y se hace push proceso[pars[1]].estado = BLOQUEADO; mete_a_cola(&bloqueados,pars[1]); cambia_proceso = TRUE; break; /////////////////////////////////////////////// case 2: printf(" EVENTO: TERMINA_E_S, ejecucion actual: %d\n",pars[0]); // se desbloquea el proceso y se mete a la cola proceso[pars[0]].estado = LISTO; push(sacar_de_cola(&bloqueados)); break; /////////////////////////////////////////////// case 3: printf(" EVENTO: PROCESO_NUEVO, ejecucion actual: %d\n",pars[0]); //if(!pars[1]== -1){ int p= proceso[pars[0]].prioridad; push(pars[0]); proceso[pars[0]].estado = LISTO;// Agregar el nuevo proceso a la cola de listos proceso[pars[0]].prioridad = p;// Asegura que la prioridad no haya cambiado en el push if(tiempo==0) cambia_proceso = TRUE; //} break; /////////////////////////////////////////////// case 4: printf(" EVENTO: PROCESO_TERMINADO, ejecucion actual: %d\n",pars[0]); proceso[pars[0]].estado = TERMINADO; cambia_proceso = TRUE; // se pide cambio de proceso break; } if(cambia_proceso) { printf(" - Se solicita cambio de proceso\n"); // Si la cola no esta vacia obtener de la cola el siguiente proceso listo if(!cola_vacia(listos)) { prox_proceso_a_ejecutar=pop(); proceso[prox_proceso_a_ejecutar].estado=EJECUCION; cambia_proceso=0; } else { printf(" - no hay listos\n"); prox_proceso_a_ejecutar=NINGUNO; } } printf(" PROCESO siguiente: %d\n",prox_proceso_a_ejecutar); printf(" </Scheduler>\n"); return(prox_proceso_a_ejecutar); }