La globalización también ha llegado a las subastas de pescado y se está diseñando un sistema para poder participar en ellas a través de Internet. Tras un primer análisis, se han identificado dos tipos de procesos, Vendedor y Comprador, cuyo comportamiento viene dado por el siguiente pseudocódigo:
task body Vendedor is Adjudicado : Boolean := False; NuevoPrecio : Precio; begin <iniciar Lote> Gestor.IniciarSubasta(Lote.pescado, Lote.precio); loop <calcular NuevoPrecio> <esperar un cierto tiempo> Gestor.ActualizarPrecio(NuevoPrecio, Adjudicado); exit when Adjudicado; end loop; end Vendedor; task body Comprador is Ps : Pescado; Pr : Precio; NuevoPrecio : Precio; Concedido : Boolean := False; Hay : Boolean; begin Gestor.UnirseASubasta(Hay, Ps, Pr); if Hay and then <interesa Ps y Pr> then while not Concedido and Hay loop Gestor.OirValor(Pr,NuevoPrecio,Hay); Pr := NuevoPrecio; if Hay and then <queremos comprar> then Gestor.Pujar (Concedido, PrecioFinal) end if; end loop; if Concedido then <comprar lote> end if; end if; end Comprador; |
Sólo habrá una instancia de Vendedor en ejecución y varias de Comprador. Como se puede ver, una característica fundamental del sistema es el escaso acoplamiento entre vendedor y compradores: aquél ignora cuántos compradores hay atendiendo a la subasta en un momento determinado y éstos ignoran si la subasta está o no abierta. La interacción con el gestor se ha pensado para que las operaciones proporcionen en todo momento esa información -- variables Hay, etc.
Las operaciones que el gestor ha de proporcionar son, pues, las siguientes:
IniciarSubasta (Ps : in Pescado; Pr : in Precio); -- Usada por el vendedor para notificar la apertura de una subasta UnirseASubasta (Hay : out Boolean; Ps : out Pescado; Pr : out Precio); -- Usada por un comprador para saber si la subasta está activa y, -- en tal caso, las características de lo subastado OirValor (PrecioAnterior : in Precio; NuevoPrecio : out Precio; Hay : out Boolean); -- Usada por un comprador para conocer el nuevo precio -- ``Hay'' sirve para saber si la subasta sigue abierta Pujar (Concedido : out Boolean; Pr : out Precio); -- ``Concedido'' indica si la puja tuvo éxito y, si es así, ``Pr'' es el precio -- a que se ha adjudicado el lote (puede haber variado desde que se pujó). ActualizarPrecio (NuevoPrecio : in Precio; Adjudicado : out Boolean); -- La llama el vendedor, y pasa en ``NuevoPrecio'' el nuevo valor de la oferta. -- Si algún comprador ha pujado desde la última actualización, -- ``Adjudicado'' se hará cierto.
Un requisito que debe cumplir el sistema es la ausencia de bucles de espera activa, tanto en el vendedor como en los compradores. En el vendedor esto se consigue mediante una pequeña espera entre actualizaciones consecutivas del precio, pero en los compradores esto no es posible, ya que introducir retardos entre llamadas consecutivas a OirValor podría resultar en la pérdida de precios intermedios. Es, por tanto, responsabilidad del gestor el sincronizar las llamadas a OirValor para que los compradores no llamen varias veces sin haberse producido variación en el precio del pescado. En otras palabras, la llamada a OirValor no debe retornar hasta que no se haya producido una variación de precio con respecto al anterior que el comprador conocía -- de ahí la necesidad del parámetro de entrada PrecioAnterior.
Se pide:
La solución propuesta es la especificación que se encuentra al principio de la siguiente parte del examen. Algunos comentarios sobre ella: