El problema del barbero durmiente

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 24 de julio de 2021; la verificación requiere 1 edición .

En informática , el problema del peluquero durmiente es un problema  clásico de sincronización y comunicación entre procesos en un sistema operativo multitarea . El reto está en conseguir que el peluquero trabaje cuando hay clientes y descanse cuando no hay clientes.

Problema

La analogía se basa en una barbería hipotética con un barbero. La peluquería tiene un puesto de trabajo y una sala de recepción con varias sillas. Cuando el peluquero termina de cortar el cabello del cliente, lo suelta y luego va al área de recepción para ver si hay clientes esperando. Si lo son, invita a uno de ellos y le corta el pelo. Si no hay clientes esperando, regresa a su silla y duerme en ella.

Cada cliente que viene mira lo que está haciendo el peluquero. Si el peluquero está dormido, el cliente lo despierta y se sienta en una silla. Si el peluquero está trabajando, entonces el cliente va a la recepción. Si hay una silla libre en la sala de espera, el cliente se sienta y espera su turno. Si no hay silla libre, el cliente se va. Basado en un análisis ingenuo, se supone que la descripción anterior garantiza que la barbería funcione correctamente con el barbero cortando a cualquiera que entre mientras hay clientes y luego durmiendo hasta que llegue el próximo cliente. En la práctica, existen varias situaciones de conflicto que ilustran los problemas generales de la planificación.

Todas estas situaciones de conflicto están relacionadas con el hecho de que las acciones tanto del peluquero como del cliente (revisar la sala de espera, entrar a la peluquería, tomar asiento en la sala de espera, etc.) toman un tiempo desconocido y/o puede ocurrir simultáneamente. Por ejemplo, un cliente puede entrar y notar que el peluquero está trabajando, entonces va a la recepción. Mientras camina, el peluquero termina el corte de cabello que está haciendo y va a revisar la sala de espera, y lo hace más rápido que el cliente que se dirige hacia allí. Como todavía no hay nadie en la recepción (el cliente aún no ha llegado), vuelve a su sitio y duerme. El peluquero ahora está esperando al cliente y el cliente está esperando al peluquero. En otro ejemplo, dos clientes pueden llegar al mismo tiempo cuando solo hay un asiento disponible en el área de recepción. Se dan cuenta de que el peluquero está en el trabajo, van a la sala de espera y ambos intentan tomar la única silla.

El problema del barbero durmiente se suele atribuir a Edsger Dijkstra (1965), uno de los pioneros de la informática.

Solución

Hay varias soluciones posibles a este problema. El elemento principal de cada una de las soluciones es un mutex  , un mecanismo que garantiza que solo uno de los participantes pueda cambiar el estado en un momento dado. El peluquero debe adquirir el mutex antes de controlar a los clientes y liberarlo cuando comience a dormir o a trabajar. El cliente deberá adquirir el mismo mutex antes de entrar en la peluquería, y liberarlo en cuanto tome asiento ya sea en la zona de recepción o en la peluquería. Esto soluciona los dos problemas mencionados en la sección anterior. También es posible utilizar el mecanismo de semáforo más general para indicar el estado actual del sistema. Por ejemplo, utilizando un semáforo, puede expresar el número de personas en la sala de espera.

La variante de múltiples peluqueros del mismo problema tiene la complejidad adicional de coordinar múltiples peluqueros entre clientes en espera.

Véase también

Enlaces