Requisito previo : problema de comunicación entre procesos : la analogía se basa en una barbería hipotética con un barbero. Hay una barbería que tiene un peluquero, una silla de peluquero y n sillas para esperar a los clientes si hay alguno para sentarse en la silla.
- Si no hay cliente, el peluquero duerme en su propia silla.
- Cuando llega un cliente, tiene que despertar al barbero.
- Si hay muchos clientes y el barbero está cortando el cabello de un cliente, entonces los clientes restantes esperan si hay sillas vacías en la sala de espera o se van si no hay sillas vacías.
Solución: La solución a este problema incluye tres semáforos . El primero es para el cliente que cuenta el número de clientes presentes en la sala de espera (el cliente en la silla del peluquero no está incluido porque no está esperando). En segundo lugar, el barbero 0 o 1 se usa para indicar si el barbero está inactivo o está trabajando, y el tercer mutex se usa para proporcionar la exclusión mutua que se requiere para que se ejecute el proceso. En la solución, el cliente tiene el registro de la cantidad de clientes que esperan en la sala de espera, si la cantidad de clientes es igual a la cantidad de sillas en la sala de espera, entonces el próximo cliente sale de la barbería.
Cuando el barbero aparece por la mañana, ejecuta el procedimiento barbero, lo que hace que se bloquee en el semáforo clientes porque inicialmente es 0. Luego, el barbero se va a dormir hasta que aparece el primer cliente.
Cuando llega un cliente, ejecuta el procedimiento del cliente, el cliente adquiere el mutex para ingresar a la región crítica, si luego ingresa otro cliente, el segundo no podrá hacer nada hasta que el primero haya liberado el mutex. Luego, el cliente verifica las sillas en la sala de espera si los clientes que esperan son menos que la cantidad de sillas, luego se sienta, de lo contrario, se va y libera el mutex.
Si la silla está disponible, el cliente se sienta en la sala de espera e incrementa el valor de espera variable y también aumenta el semáforo del cliente, esto despierta al peluquero si está durmiendo.
En este punto, el cliente y el peluquero están despiertos y el peluquero está listo para cortarle el cabello a esa persona. Cuando termina el corte de cabello, el cliente sale del procedimiento y si no hay clientes en la sala de espera, el peluquero duerme.
Algoritmo para el problema de Sleeping Barber:
Semaphore Customers = 0; Semaphore Barber = 0; Mutex Seats = 1; int FreeSeats = N; Barber { while(true) { /* waits for a customer (sleeps). */ down(Customers); /* mutex to protect the number of available seats.*/ down(Seats); /* a chair gets free.*/ FreeSeats++; /* bring customer for haircut.*/ up(Barber); /* release the mutex on the chair.*/ up(Seats); /* barber is cutting hair.*/ } } Customer { while(true) { /* protects seats so only 1 customer tries to sit in a chair if that's the case.*/ down(Seats); //This line should not be here. if(FreeSeats > 0) { /* sitting down.*/ FreeSeats--; /* notify the barber. */ up(Customers); /* release the lock */ up(Seats); /* wait in the waiting room if barber is busy. */ down(Barber); // customer is having hair cut } else { /* release the lock */ up(Seats); // customer leaves } } }
Publicación traducida automáticamente
Artículo escrito por kunaljoshi1 y traducido por Barcelona Geeks. The original can be accessed here. Licence: CCBY-SA