Sistemas operativos modernos
#define SILLAS 5 typedef ¡nt semaforo; semaforo clientes = 0; semaforo peluqueros = 0; semaforo mutex = 1; int espera = 0; void barbero(void) { while (TRUE) { down(&clientes); down(&mutex); espera = espera - 1; up(&barberos); up(&mutex); cortar_pelo( ); /* núm. de sillas para clientes que esperan */ r emplee su imaginación */ /* núm. de clientes que esperan servicio */ r núm. de barberos que esperan clientes 7 /* para exclusión mutua */ r clientes esperando */ /* se desactiva si núm. de clientes es O */ /* obtiene acceso a ‘espera’ V /* decrementa núm. de clientes en espera V r un barbero listo para cortar el pelo */ /* libera ‘espera’ V /* corta el pelo (fuera de la región crítica) */ } } void cliente(void) { down{&mutex): if (espera < SILLAS) { espera = espera + 1; up(&clientes); up(&mutex); down(&barberos): recibir_corte( ); } else { up(&mutex); } /* entra en región crítica 7 /* si no hay sillas libres, se va 7 /* incrementa núm. de clientes esperando 7 r activa al barbero si es preciso 7 /* renuncia al acceso a ‘espera’ 7 /* se desactiva si no hay barberos desocupados 7 r se sienta y es atendido 7 /* peluquería llena; no espera 7 Figura 2'36. Una solución al problema del barbero dormilón. Cuando un cliente llega, ejecuta cliente, que inicia por obtener mutex para entrar en una re gión crítica. Si otro cliente entra poco después, no podrá hacer nada hasta que el primero haya liberado mutex. Entonces ei cliente verificará si el número de clientes en espera es menor que el número de sillas. De lo contrario, liberará mutex y saldrá sin que le corten el pelo. Si hay una silla desocupada, el cliente incrementa la variable entera espera y luego ejecu ta up con el semáforo clientes, lo cual activa al barbero. En este punto, tanto el cliente como
RkJQdWJsaXNoZXIy MjI4NDcx