Examen agosto 2003. Problema 3

Examen agosto 2003. Problema 3

de Agustina Moraes Nuñez -
Número de respuestas: 2

Buenas. Me quedan algunas dudas sobre la solución de este problema.

En la letra se dice que "una vez finalizada la carga por parte de los vehículos, estos deberán dirigirse a la caja con menos vehículos esperando para pagar y allí realizar el pago", lo que da a entender que los vehículos esperan en una fila para pagar. Sin embargo, entiendo que en la solución se asume que no hay filas en las cajas ya que cuando un procedimiento AUTO invoca al procedimiento pagar_combustible(), este le asigna una caja (con la función cobrar_empezar() del monitor admin_cajas) e inmediatamente se llama al procedimiento pagar(), que asumo que ahí hubo un error y se está queriendo a cobrar() del monitor caja. En cobrar() lo que se hace es directamente invocar a cobrar_combustible(), no se hace ningún wait() en una condition del monitor caja que bloquearía a los procedimientos que quieran cobrar si es que hay otros que llegaron antes y también están esperando.

También tengo otra consulta con respecto a la parte de recargar el tanque de nafta, para lo cual se dice en la letra que mientras se esté recargando el tanque no pueden haber autos abasteciéndose. Supongamos que ocurren los siguientes pasos (mirando el código de la solución):

1. Se llama a recargar_gran_tanque()

2. Se ejecutan las primeras 2 iteraciones del for dentro de recargar_gran_tanque()

3. Se le saca la CPU al procedimiento que invocó a recargar_gran_tanque() y se le da la CPU a un procedimiento que invoca a cargar() en el tercer surtidor. Al evaluar "if(carga_gt)" le da falso entonces no entra al if y llama a surtir_combustible().

4. Se le saca la CPU a este procedimiento y se la devuelve al primero (al que había invocado a recargar_gran_tanque())

5. Se ejecuta la tercera iteración del for y se invoca a llenar_gran_tanque()

En este momento se va a estar llenando el gran tanque y a su vez va a haber un auto cargando combustible en el tercer surtidor.

No se si hay algo en mi razonamiento que esté mal para estas partes o si entendí mal la letra. Les agradezco si me pueden ayudar.

Saludos!

En respuesta a Agustina Moraes Nuñez

Re: Examen agosto 2003. Problema 3

de Manuel Freire -
Hola,

Respondo entre líneas.

Sin embargo, entiendo que en la solución se asume que no hay filas en las cajas ya que cuando un procedimiento AUTO invoca al procedimiento pagar_combustible(), este le asigna una caja (con la función cobrar_empezar() del monitor admin_cajas) e inmediatamente se llama al procedimiento pagar(), que asumo que ahí hubo un error y se está queriendo a cobrar() del monitor caja. En cobrar() lo que se hace es directamente invocar a cobrar_combustible(), no se hace ningún wait() en una condition del monitor caja que bloquearía a los procedimientos que quieran cobrar si es que hay otros que llegaron antes y también están esperando.
Fijate que cobrar() es una función del monitor y si bien invoca cobrar_combustible() de una dado que está adentro del monitor nadie podrá entrar al monitor de esa caja y por eso no van a haber dos autos ejecutando esa función sobre la misma caja al mismo tiempo. La fila queda definida por la fila FIFO que se genera para entrar al monitor. Con respecto a lo de pagar() tenés razón, está mal.

También tengo otra consulta con respecto a la parte de recargar el tanque de nafta, para lo cual se dice en la letra que mientras se esté recargando el tanque no pueden haber autos abasteciéndose. Supongamos que ocurren los siguientes pasos (mirando el código de la solución):
Del flujo de eventos que marcas acá tenés un error parecido al anterior en el (5), dado que el proceso de (3) está ejecutando la función surtir_combustible() tiene el monitor él y por tanto el proceso de (5) no puede ingresar al monitor y se bloquea a la espera de que el otro vuelva a ejecutar, termine de surtir y salga del monitor. 

Remarcar de nuevo que si un proceso tiene un monitor por más que pierda la CPU nadie podrá entrar al monitor hasta que él salga (o bien por un wait o porque termina el código), creo que de ahí vienen los dos errores. Decime si quedó claro y si no la seguimos.

Saludos!
En respuesta a Manuel Freire

Re: Examen agosto 2003. Problema 3

de Agustina Moraes Nuñez -
Me quedo claro! Estaba pensando como si los procedimientos que están dentro de un monitor pudieran ejecutarse concurrentemente por dos procedimientos y ya vimos que no funciona así. Disculpá la confusión y muchas gracias!