示例#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);
}
示例#2
0
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();
}
示例#3
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);
}