19 de abril de 2011
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.