[Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

[Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

de Franco Danilo Wanseele Gonzalez -
Número de respuestas: 7

Hola, tengo una duda con respecto a la resolución de este ejercicio, que dice lo siguiente:




No logro darme cuenta que funciona cumple el semáforo mutexProdEmb.

"Ejecute a mano" el código sin usar el semáforo mutexProdEmb y no veo ninguna situación en donde se produzca un resultado erróneo o algún deadlock. 

Muchas gracias!

En respuesta a Franco Danilo Wanseele Gonzalez

Re: [Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

de Guillermo Angel Kuster Techera -

Por lo que entiendo, ese semáforo sirve para dar precedencia a los inspectores, cuando hay uno esperando por sobre los embotelladores o productores.

Supone este ejemplo sencillo. Un embotellador, un productor y un inspector son ejecutados concurrentemente. El productor toma el control del tanque y el embotellador e inspector quedan a la espera. Cuando el productor termina de usar el tanque, primero ejecuta V(tanque) y luego V(mutexProdEmb), lo que da prioridad al inspector a tomar el recurso tanque por sobre el embotellador.

Asi fue como lo entendi yo.

En respuesta a Guillermo Angel Kuster Techera

Re: [Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

de Hugo Sebastian Rodriguez Reyes -

No estoy de acuerdo con ese argumento, por ejemplo:

El productor toma el control del tanque, llega PRIMERO el inspector, llega DESPUÉS la embotelladora; teóricamente cuando el productor deje libre el tanque, DEBERÍA entrar el inspector ya que LLEGO ANTES que la embotelladora.

Sin embargo nada garantiza que una vez que el productor haga V(tanque) y V(mutexProdEmb), el primero que ejecute sea el inspector.

De hecho, tanto el productor como el inspector como la embotelladora están entre un COBEGIN-COEND. Esto significa que puede ejecutar cualquiera en cualquier orden, incluso pueden ejecutar algunas líneas de uno y algunas líneas de otro intercambiadas.

Entonces la pregunta es:

Si el productor hace V(tanque) y V(mutexProdEmb), por qué aseguras que ejecuta el inspector antes que la embotelladora? Porque perfectamente (dependiendo del planificador de la CPU), podría tomar la CPU la embotelladora y no se estaría teniendo prioridad para el inspector que llegó antes.

Yo creo que la solución no respeta la prioridad para el inspector. Me gustaría que algún profesor explique, en caso de estar errado, porque ésta solución sí la respeta.

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

de Jorge Merlino -

La solución funciona porque cuando, en tu ejemplo, el productor hace V(tanque) como ya estaba esperando el inspector en ese semáforo se lo va a despertar (queda en estado listo) y el semáforo va a quedar en 0. Si la embotelladora toma la CPU primero (lo cual es posible) se va a quedar bloqueada en el P(tanque) por lo dicho anteriormente.

En respuesta a Jorge Merlino

Re: [Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

de Hugo Sebastian Rodriguez Reyes -

Jorge, muchas gracias por tu respuesta.

Siguiendo con el ejemplo, supongamos que el inspector llega pero no alcanza a ejecutar P(tanque) (lo cual es posible), luego llega la embotelladora y se queda trancada en P(mutexProdEmb). De esto concluímos que debe ejecutar primero el inspector cuando la productora termine de ejecutar.

Ahora, ponele que la productora termina de ejecutar su código, o sea que hizo V(tanque), V(mutexProdEmb) y las otras sentencias. Ahora ambos semáforos están accesibles.

La embotelladora había quedado trancada en P(mutexProdEmb), ahora puede seguir ejecutando. 

Si llegara hacer P(tanque) antes que el inspector ejecute P(tanque) (lo cual es posible), tomaría ese semáforo.

Esto no estaría bien, ya que el inspector llegó antes que la embotelladora.

Es correcto?

En respuesta a Hugo Sebastian Rodriguez Reyes

Re: [Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

de Maximiliano Andres Barragan Pavoni -

Me parece que el problema ahí es que "lo primero que hace el inspector" es P(tanque), entonces no se si se considera que "llegó el inspector", hasta que no ejecuta 'P(tanque)'.

En respuesta a Maximiliano Andres Barragan Pavoni

Re: [Parcial Junio 2018] [Ejercicio 3.b] Duda sobre semáforos

de Jorge Merlino -

Esto es correcto. Si el sistema no tiene forma de saber que el inspector llegó no se le puede dar prioridad. En este caso el P(tanque) funciona como el aviso de que llegó el inspector. Sería el equivalente en el caso de monitores de la entrada que pone inspector = true o similar. Si asumís que hay que darle prioridad al inspector antes de que haga eso es imposible de resolver.