Esempio n. 1
0
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);
}
Esempio n. 2
0
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);
}