Sunteți pe pagina 1din 4

PRACTICA UNIX 2015/16 Grupo G3 | Israel Cáceres Marcos y Mario Gullón Casado

Proceso Padre:
- INICIO.
- INICIA MECANISMOS IPC (SEMAFOROS,MEMORIA COMPARTIDA…):

o Semáforo Principal (SP0,SP1) -> índice 0 Biblioteca, índice 1 Pistoletazo


o Semáforo Derecho e Izquierdo [ SD(i), SI(i); SCarril para referirnos a cualquiera
de ellos ] -> 137 índices cada uno. Uno por posición de carril, inicializados en
1 para exclusión mutua

- INICIAMOS FALONSO
- CREA UN PROCESO HIJO POR COCHE Y ALMACENA SU PID
- DA LA ORDEN DE SALIDA HACIENDO SIGNAL TANTAS VECES COMO NUMERO DE
PROCESOS AL SEMAFORO DEDICADO AL PISTOLETAZO DE SALIDA.
- ESTABLECE LA RUTINA DE LOS SEMÁFOROS LUMINOSOS EN EL CIRCUITO
- UNA VEZ SE PULSE CTRL+C, SALDRA DEL BUCLE DE RUTINA DE SEMÁFOROS, Y
TERMINARA/ESPERARA A LOS PROCESOS HIJOS QUE NO HAYAN TERMINADO.
- UNA VEZ TERMINADOS TODOS LOS PROCESOS, CALCULARA LA CUENTA ACCEDIENDO
A LA MEMORIA COMPARTIDA DONDE LOS PROCESOS HIJOS LA VAN AUMENTANDO.
- FINALIZAMOS FALONSO
- TERMINAMOS CON LOS MECANISMOS IPC
- FIN.
PRACTICA UNIX 2015/16 Grupo G3 | Israel Cáceres Marcos y Mario Gullón Casado

PSEUDO-CÓDIGO PROCESO PADRE


INICIO_PADRE{
establecer_mecanismos_IPC();
SP1 = 0;
SCarril(0-136) = 1;
inicio_falonso();
i=0;
mientras_i<numeroProcesosaCrear{
crear_hijo();
almacenar_pid_hijo();
};
Pistoletazo_salida(); // Signal(SP1) tantas veces como numero coches
Mientras_no_SIGINT{
Rutina_semaforos_luminosos();
}
If(pid_hijo_existe){
Matar_pid_hijo();
Esperar_pid_hijo();
}
Realizar_cuenta_final_vueltas();
Fin_falonso(cuenta_final);
Fin_mecanismos_ipc();
Return 0;
}//FIN PADRE
PRACTICA UNIX 2015/16 Grupo G3 | Israel Cáceres Marcos y Mario Gullón Casado

Procesos Hijo (COCHES):


- ELEGIMOS CARRIL Y POSICION DE COLOCACION.
- CALCULAMOS VELOCIDAD Y COLOR ALEATORIO PARA CADA COCHE.
- WAIT AL SEMAFORO CORRESPONDIENTE A ESA POSICION/CARRIL
- COLOCAMOS EL COCHE EN ESA POSICION/CARRIL
- WAIT AL SEMAFORO DE PISTOLETAZO DE SALIDA (SP1)
- BUCLE DE FUNCIONAMIENTO DE COCHE (MIENTRAS NO SIGINT):
o COMPROBAMOS SI LA POSICION SIGUIENTE A LA ACTUAL ESTA OCUPADA
 SI NO LO ESTA:
 WAIT AL SEMAFORO CARRIL/POSICION+1
 AVANZAMOS EL COCHE UNA POSICION
 SIGNAL AL SEMAFORO CARRIL/POSICION (LA ANTERIOR)
 SI LO ESTA:
 COMPROBAMOS SI LA POSICION DE ADELANTAMIENTO ESTA
OCUPADA
 SI NO LO ESTA
 WAIT AL SEMAFORO CARRIL/POSICION DE
ADELANTAMIENTO
 CAMBIAMOS DE CARRIL
 SIGNAL AL SEMAFORO CARRIL/POSICION
ANTES DE ADELANTAR.
 SI LO ESTA
 NO HACEMOS NADA, VOLVEMOS AL BUCLE
o INCREMENTAMOS EL CONTADOR DE VUELTAS EN LA MEMORIA COMPARTIDA
SI ESTAMOS EN LA POSICIÓN DEL CONTADOR DE VUELTAS.

- FIN DE BUCLE DE FUNCIONAMIENTO DE SIGINT (CUANDO SIGINT)


o FIN DEL PROCESO HIJO.
PRACTICA UNIX 2015/16 Grupo G3 | Israel Cáceres Marcos y Mario Gullón Casado

PSEUDO-CÓDIGO PROCESOS HIJO


INICIO_HIJO{
Elegir_carril_posicion();
W(SCarril(posición)); //BLOQUEAR LA POSICION
Colocar_coche();
mientras_NO_SIGINT{
if(podemos_avanzar_recto){
W(SCarril(posición));
Avance_coche();
S(SCarril(posicionAnterior)
}else{
If(podemos_adelantar){
W(SCarrilContrario(posicionAdelantamiento));
Cambio_carril();
S(SCarrilContrario(posicionAnterioralAdelantamiento));
}
}
If(posición == posicionCheckVuelta){
Incrementar_vuelta_en_memoria_compartida();
}
} // FIN CUANDO SIGINT
Return 0;
}//FIN HIJO

S-ar putea să vă placă și