Está en la página 1de 2

Sistemas Operativos 19 de abril de 2011

Facultad de Ciencias Exactas y Naturales


Universidad de Buenos Aires

Clase Práctica
Ejercicios de Semáforos

Enunciado

Mirtha LeBig tiene un popular programa de televisión en el que


invita a importantes referentes del show business y de la derecha
argentina a almorzar y conversar sobre sus vidas y sobre temas de
actualidad. La dinámica del programa es la siguiente:

• Al programa asisten N invitados. Los comensales se sientan


a la mesa, siendo Mirtha la última en sentarse.
• Una vez que se sentó Mirtha, los M mozos sirven la comida.
Por problemas de presupuesto, la cantidad de mozos es
siempre menor a la cantidad de invitados.
• Los mozos no deben servir más de N+1 platos. Cualquier comensal (incluida
Mirtha) puede comenzar a comer, incluso si no han terminado de servir a todos los
invitados.
• Cuando Mirtha termina de comer, ella lanza una pregunta polémica. Esta pregunta
puede ser respondida por cualquier invitado que haya terminado de comer. Sólo un
invitado debe responder la pregunta.
• Para mantener alto el rating, Mirtha se enoja muchísimo por la respuesta polémica,
se levanta y se va del estudio. Si Mirtha ya se ha levantado, los invitados pueden
hacer lo mismo, pero sólo si ya han terminado de comer.

Las primitivas disponibles son:


• sentarse()
• servir_comida()
• comer()
• enojarse()
• levantarse()
• lanzar_pregunta_polemica()
• lanzar_respuesta_polemica()

Consignas

1. Realice una solución usando semáforos para el problema descripto anteriormente.


2. Explicar brevemente cómo funciona la solución indicando qué semáforos necesitó y
para qué; y cuántos procesos diferentes tuvo.
3. ¿En algún punto de la solución se puede producir inanición? ¿Dónde? ¿Por qué?
Solución

1 y 2) En la solución se usan 3 tipos de procesos, que corresponden respectivamente a los


invitados, los mozos y finalmente Mirtha. Se utilizan dos variables auxiliares, una para
contabilizar que se sirva la cantidad correcta de platos, y otra para asegurar que sólo uno de
los invitados responda a la pregunta polémica.

sem mirtaPuedeSentarse = -N + 1 // Para que Mirta espere que se sienten todos los invitados
sem puedenServir = 0 // Para contener a los mozos en sus gateras

sem sePuedeComer = 0
int platosRestantes = N + 1 // Cantidad de platos que falta servir
sem mutexPR = 1 // Controla el acceso a los datos relacionados con platos para evitar RC

bool seRespondio = 0 // Para coordinar que sólo uno responda a la pregunta


sem mutexSR = 1
sem huboPregunta = 0 // Para que los comensales esperen la pregunta polémica
sem huboRespuesta = 0 // Para que Mirta espere la respuesta polémica
sem sePuedenIr = 0 // Para que los invitados no se levanten hasta la partida de Mirta

Mirta Invitado
wait(mirtaPuedeSentarse) sentarse()
sentarse() signal(mirtaPuedeSentarse)
// Despierto M mozos wait(sePuedeComer)
signal(puedenServir, M) comer()
wait(sePuedeComer)
comer() wait(huboPregunta)

lanzar_pregunta_polemica() wait(mutexSR)
signal(huboPregunta) if seRespondio == 0:
wait(huboRespuesta) lanzar_respuesta_polemica()
enojarse() seRespondio = 1
levantarse() signal(huboRespuesta)
signal(sePuedenIr, N) // Destrabo a los demás comensales
// para que puedan levantarse cuando hayan
// terminado de comer.
Mozos signal(huboPregunta, N-1)
signal(mutexSR)
wait(puedenServir) wait(sePuedenIr)
while 1: levantarse()
wait(mutexPR)
if platosRestantes > 0:
platosRestantes--
signal(mutexPR)
servir_comida()
signal(sePuedeComer)
else:
signal(mutexPR)
break // Ya terminé de servir

3) Incluso en caso de tener un scheduler injusto (es decir, uno que no garantiza una porción
del tiempo de CPU a todos los procesos listos), la solución implementada no puede tener
inanición ya que todos los procesos mozos terminan y los demás hacen progresar el sistema
hacia su estado final. Si se hubiera omitido el break en el ciclo principal de los mozos,
podría ocurrir que el scheduler les diera prioridad a éstos (que ya no tienen nada que hacer)
y eso le impidiera a los demás procesos continuar trabajando.

También podría gustarte