Vous êtes sur la page 1sur 3

cena de los filosofos

http://es.slideshare.net/
https://es.wikipedia.org/
https://es.wikipedia.org/wiki/

Problema del barbero durmiente

El barbero le est cortando el pelo al cliente


En ciencias de la computacin, el

problema del barbero durmiente es un problema de sincronizacin. El problema consiste en


una barbera en la que trabaja un barbero que tiene un nico silln de barbero y varias sillas para
esperar. Cuando no hay clientes, el barbero se sienta en una silla y se duerme. Cuando llega un
nuevo cliente, ste o bien despierta al barbero o si el barbero est afeitando a otro cliente se
sienta en una silla (o se va si todas las sillas estn ocupadas por clientes esperando). El problema
consiste en realizar la actividad del barbero sin que ocurran condiciones de carrera. La solucin
implica el uso de semforos y objetos de exclusin mutua para proteger la seccin crtica.
Un semforo es una variable protegida (o tipo abstracto de datos) que constituye el mtodo
clsico para restringir o permitir el acceso a recursos compartidos (por ejemplo, un recurso de
almacenamiento) en un entorno de multiprocesamiento. Fueron inventados por Edsger Dijkstra y
se usaron por primera vez en el sistema operativo THEOS.
En electrnica y en programacin concurrente, se conoce como condicin de carrera al error que
se produce en programas o circuitos lgicos que no se han construido adecuadamente para su
ejecucin simultnea con otros procesos.

Implementaci
n

El prximo pseudo-cdigo garantiza la sincronizacin entre el barbero y el cliente, pero puede


llevar a inanicin del cliente. wait() y signal() son funciones provistas por elsemforo.

Se necesita:
Semforo barberoListo = 0

// (Mutex, slo 1 0)

Semforo sillasAccesibles = 1 // (Mutex) Cuando sea 1, el numero de sillas libres puede


aumentar o disminuir
Semforo clientes = 0

// Nmero de clientes en la sala de espera

int sillasLibres = N

// N es el nmero total de sillas

Funcin barbero (Proceso/hilo-thread):


while(true)

// Ciclo infinito

{
wait(clientes)
wait(sillasAccesibles)
sillasLibres += 1
signal(barberoListo)

// Tratar de atender a un cliente. Si no hay, ir a dormir.


// (Ya est despierto) Tratar de modificar el nro. de sillas disponibles.
// Queda disponible una silla en la sala.
// El barbero est listo para cortar.

signal(sillasAccesibles) // Ya no se modificar el nro. de sillas libres. Desbloquear.


// Aqu el barbero corta el pelo de un cliente (zona de cdigo no crtico).
}

Funcin cliente (Proceso/hilo-thread):


wait(sillasAccesibles)
if (sillasLibres > 0)

// Trata de acceder a una silla.


// Si hay sillas disponibles.

{
sillasLibres =- 1

// Se sienta en una silla.

signal(clientes)

// Avisar al barbero (el cual est esperando) que hay un cliente.

signal(sillasAccesibles) // Ya no se necesita bloquear el nro de sillas libres.


wait(barberoListo)

// El cliente espera a que el barbero est listo para atenderlo.

// Se le corta el pelo al cliente.


}
else

// Si no hay sillas libres.

{
signal(sillasAccesibles) // Desbloquear la modificacin de sillas libres para otros
procesos/hebras.
// El cliente se va de la barbera

Vous aimerez peut-être aussi