Documentos de Académico
Documentos de Profesional
Documentos de Cultura
Semaforos PDF
Semaforos PDF
Clase Práctica
Ejercicios de Semáforos
Enunciado
Consignas
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
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.