Anda di halaman 1dari 2

Sistemas Operativos Facultad de Ciencias Exactas y Naturales Universidad de Buenos Aires

19 de abril de 2011

Clase Prctica Ejercicios de Semforos


Enunciado
Mirtha LeBig tiene un popular programa de televisin 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 dinmica 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 ms 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 polmica. Esta pregunta puede ser respondida por cualquier invitado que haya terminado de comer. Slo un invitado debe responder la pregunta. Para mantener alto el rating, Mirtha se enoja muchsimo por la respuesta polmica, se levanta y se va del estudio. Si Mirtha ya se ha levantado, los invitados pueden hacer lo mismo, pero slo si ya han terminado de comer.
sentarse() servir_comida() comer() enojarse() levantarse() lanzar_pregunta_polemica() lanzar_respuesta_polemica()

Las primitivas disponibles son:


Consignas
1. Realice una solucin usando semforos para el problema descripto anteriormente. 2. Explicar brevemente cmo funciona la solucin indicando qu semforos necesit y para qu; y cuntos procesos diferentes tuvo. 3. En algn punto de la solucin se puede producir inanicin? Dnde? Por qu?

Solucin
1 y 2) En la solucin 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 slo uno de los invitados responda a la pregunta polmica.
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 slo uno responda a la pregunta sem mutexSR = 1 sem huboPregunta = 0 // Para que los comensales esperen la pregunta polmica sem huboRespuesta = 0 // Para que Mirta espere la respuesta polmica sem sePuedenIr = 0 // Para que los invitados no se levanten hasta la partida de Mirta

Mirta
wait(mirtaPuedeSentarse) sentarse() // Despierto M mozos signal(puedenServir, M) wait(sePuedeComer) comer() lanzar_pregunta_polemica() signal(huboPregunta) wait(huboRespuesta) enojarse() levantarse() signal(sePuedenIr, N)

Invitado
sentarse() signal(mirtaPuedeSentarse) wait(sePuedeComer) comer() wait(huboPregunta) wait(mutexSR) if seRespondio == 0: lanzar_respuesta_polemica() seRespondio = 1 signal(huboRespuesta) // Destrabo a los dems comensales // para que puedan levantarse cuando hayan // terminado de comer. signal(huboPregunta, N-1) signal(mutexSR) wait(sePuedenIr) levantarse()

Mozos
wait(puedenServir) while 1: 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 porcin del tiempo de CPU a todos los procesos listos), la solucin implementada no puede tener inanicin ya que todos los procesos mozos terminan y los dems hacen progresar el sistema hacia su estado final. Si se hubiera omitido el break en el ciclo principal de los mozos, podra ocurrir que el scheduler les diera prioridad a stos (que ya no tienen nada que hacer) y eso le impidiera a los dems procesos continuar trabajando.

Anda mungkin juga menyukai