next up previous
Next: Implementación de un controlador Up: Examen de Programación Concurrente Previous: Examen de Programación Concurrente

Subsecciones



Diseño de un controlador para un cruce de trenes [4 puntos]

Se pretende diseñar un controlador que regule las salidas de dos estaciones de tren cuyas vías se cruzan. El aspecto de las estaciones y las vías se muestra a continuacion:


\includegraphics[width=0.5\textwidth]{im/estacion.eps}


En cada estación se cargan trenes con mercancías y se solicita la salida de un tren cuando está lleno. La forma de solicitar la salida es mediante un terminal de ordenador en que se introduce el número de vía en la que está estacionado el tren y qué tipo de tren es (ver más abajo). Un tren arranca cuando su semáforo se pone en verde. Tras salir de la estación el tren entra en el cruce, en el que no debe haber dos trenes simultáneamente. A la salida del cruce hay un sensor en cada vía que detecta cuándo el tren ya ha abandonado el cruce.

Hay trenes de dos tipos: urgentes y normales. Dentro de cada estación, los trenes urgentes tienen siempre preferencia sobre los normales y la salida de estos últimos debe retrasarse hasta que no haya ningún tren urgente esperando. Dentro de la misma categoría de trenes y en una estación dada las peticiones de salida deben ser atendidas en el mismo orden en que fueron realizadas.

Tenemos el siguiente interfaz para leer datos acerca de los sensores de las vías y de las peticiones de salida de trenes, y para notificar la salida de los trenes:



\begin{lstlisting}{}
Sensor.EsperarPasoTren(NumeroEstacion: TipoNumEst)
(* Se bl...
...)
(* y la clase de tren se devuelve en Clase. Es bloqueante. *)
\end{lstlisting}


Se suponen las definiciones de tipos


\begin{lstlisting}{}
TYPE TipoNumEst = [1..2];
TipoNumVia = 1..MaxVias;
TipoTren = (urgente, normal);
\end{lstlisting}

y se asume que no hay que comprobar la corrección de los datos que llegan del terminal (por ejemplo, nunca se va a decir que hay un tren esperando en una vía cuando en realidad no lo hay) ni preocuparse por eventualidades ajenas al funcionamiento correcto de la estación (por ejemplo, que un tren no pueda arrancar).


Se pide: realizar un diseño para el controlador del cruce que garantice que no habrá choques y que respete las prioridades antedichas entre trenes. Se sugiere seguir los siguientes pasos:

  1. Dar el esquema de recursos y procesos. Incluir los nombres de las operaciones en el/los recurso(s) y señalar claramente qué operaciones usa cada proceso.
  2. Redactar el código de los procesos que aparezcan en el punto anterior. La comunicación con el personal de la estación y con el sensor del cruce debe utilizar únicamente el interfaz expuesto anteriormente.
  3. Especificar formalmente con un C-TAD el/los recurso(s) que aparezcan en el primer apartado de esta pregunta.


Nota: aunque el texto del problema habla únicamente de dos estaciones, pensar en el problema como si tuviese $n$ estaciones puede ayudar a tener una solución más elegante.

Solución propuesta:

Una posible solución se encuentra al principio del ejercicio 2. Otra posible variante, igualmente válida, utiliza únicamente dos clases de procesos: una de ellas inserta en el recurso compartido las peticiones del terminal, y el otro recupera la siguiente petición a ser satifecha y espera a que pase por el cruce:


\begin{lstlisting}{}
TASK AdmisionPeticion(i)
LOOP
Terminal.LeerPeticion(i, ClaseTren, Via);
Estacion.TrenListo(i, ClaseTren, Via);
END;
END;
\end{lstlisting}

\begin{lstlisting}{}
TASK ControladorCruce;
LOOP
Estacion.PermisoSalirEst(i, V...
...foro.DarSalida(i, Via);
Sensor.EsperarPasoTren(i);
END;
END;
\end{lstlisting}


Esta solución también simplifica el recurso compartido, pues Estacion.PermisoSalirEst no tiene que tener en cuenta la ocupación del cruce. La solución se basa fuertemente en la cadencia y no cambio de vía de los trenes que salen de las estaciones.

Entre los errores cometidos se encuentran:


next up previous
Next: Implementación de un controlador Up: Examen de Programación Concurrente Previous: Examen de Programación Concurrente
Manuel Carro
2001-10-04