algoritmo del barbero dormilon

3

Click here to load reader

Upload: victor-armando-pech-canul

Post on 04-Aug-2015

348 views

Category:

Documents


6 download

TRANSCRIPT

Page 1: Algoritmo Del Barbero Dormilon

ALGORITMO DEL BARBERO DORMILON

El problema del barbero durmiente es un problema de sincronización; consiste en una barbería en la que trabaja un barbero, que tiene un único sillón 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 están ocupadas por clientes esperando). El problema consiste en realizar la actividad del barbero sin que ocurran condiciones de carrera. La solución implica el uso de semáforos y objetos de exclusión mutua para proteger la sección crítica.

Un semáforo es una variable protegida (o tipo abstracto de datos) que constituye el método clásico 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 electrónica y en programación concurrente, se conoce como condición de carrera al error que se produce en programas o circuitos lógicos que no se han construido adecuadamente para su ejecución simultánea con otros procesos.

Algoritmo de solución

Page 2: Algoritmo Del Barbero Dormilon

Solución al problema del barbero dormilón en lenguaje C

/* Solucion al problema del barbero dormilon. */#define TRUE1#define CHAIRS5typedef struct { int value; /* Lista de procesos. */ }semaphore;semaphore mutex, barber, customer;int waiting = 0;main (){ extern semaphore mutex, barber, customer; InitSemaphore (mutex, 1); InitSemaphore (barber, 0); InitSemaphore (customer, 0); /* Inicia los procesos barbero y clientes. */}voidBarber (){ while (TRUE) { /* Espera a que haya clientes. */ wait (customer); /* Acceso exclusivo a waiting. */ wait (mutex); /* Un cliente va a ser servido. */ waiting--; /* Un barbero esta libre. */ signal (barber); signal (mutex); /* Corta el pelo fuera de la seccion critica. */ CutHair (); }}voidCustomer (){ /* Acceso exclusivo a waiting. */ wait (mutex); if (waiting < CHAIRS) { /* Si hay silla espera. */ waiting++; /* Despierta al barbero. */ signal (customer); signal (mutex); /* Se va a dormir si no hay barberos. */ wait (barber); GetHaircut (); } else /* Se va si no hay sitio. */ signal (mutex);}

Page 3: Algoritmo Del Barbero Dormilon