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); }
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); }