Cena de Los Filosofos
Short Description
Download Cena de Los Filosofos...
Description
Arias Celis, Carla Barrios Ponce, Rafael Carrera Yépez, Italo Concha Zevallos, Jhony Diaz Zea, Marybel
ENUNCIADO DEL PROBLEMA Cinco filósofos se sientan alrededor de una mesa y pasan su vida cenando y pensando. Cada filósofo tiene un plato de fideos y un tenedor a la izquierda de su plato. Para comer los fideos son necesarios dos tenedores y cada filósofo sólo puede tomar los que están a su izquierda y derecha. Si cualquier filósofo coge un tenedor y el otro está ocupado, se quedará esperando, con el tenedor en la mano, hasta que pueda coger el otro tenedor, para luego empezar a comer. c omer.
ENUNCIADO DEL PROBLEMA Si dos filósofos adyacentes intentan tomar el mismo tenedor a una vez, se produce una condición de carrera: ambos compiten por tomar el mismo tenedor, y uno de ellos se queda sin comer. Si todos los filósofos cogen el tenedor que está a su derecha al mismo tiempo, entonces todos se quedarán esperando eternamente, porque alguien debe liberar el tenedor que les falta. Nadie lo hará porque todos se encuentran en la misma situación (esperando que alguno deje sus tenedores). Entonces los filósofos se morirán de hambre. Este bloqueo mutuo se denomina interbloqueo o deadlock . El problema consiste en encontrar un algoritmo que permita que los filósofos nunca se mueran de hambre.
ENUNCIADO DEL PROBLEMA
CONDICIONES PARA POSIBLES SOLUCIONES Una solución óptima se considerará aquella que permita el que él número máximo de filósofos pueda alimentarse a la vez, es decir, maximizar la concurrencia (dos a la vez supuestamente para el caso de 5 filósofos). Se debe evitar que se produzca en nuestra solución: Interbloqueo Inanición o postergación indefinida •
•
CONDICIONES PARA POSIBLES SOLUCIONES Condiciones para que ocurra un deadlock: •
•
•
•
Exclusión Mutua: los procesos reclaman control exclusivo de los recursos que piden. Retención y Espera: los procesos mantienen los recursos que ya les han sido asignados mientras esperan por recursos adicionales No Apropiación: los recursos no pueden ser extraídos de los procesos que los tienen hasta su completa utilización Espera Circular: existe una cadena circular de procesos en la cual cada uno de ellos mantiene a uno o más recursos que son requeridos por el siguiente proceso de la cadena.
ALGUNAS POSIBLES SOLUCIONES Por turno cíclico Se empieza por un filósofo, que si quiere puede comer y después pasa su turno al de la derecha. Cada filósofo solo puede comer en su turno. Problema: si el número de filósofos es muy alto, uno puede morir de hambre antes de su turno.
Varios turnos Se establecen varios turnos. Para hacerlo más claro supongamos que cada filósofo que puede comer (es su turno) tiene una ficha que después pasa a la derecha.
ALGUNAS POSIBLES SOLUCIONES Colas de tenedores Cuando un filósofo quiere comer se pone en la cola de los dos tenedores que necesita.
Cuando un tenedor está libre lo toma. Cuando toma los dos tenedores, come y deja libre los tenedores. Resolución de conflictos en colas de tenedores Cada vez que un filósofo tiene un tenedor espera un tiempo aleatorio para conseguir el segundo tenedor. Si en ese tiempo no queda libre el segundo tenedor, suelta el que tiene y vuelve a ponerse en cola para sus dos tenedores.
ALGUNAS POSIBLES SOLUCIONES El portero del comedor Se indica a los filósofos que abandonen la mesa cuando no tengan hambre y que no regresen a ella hasta que vuelvan a estar hambrientos (cada filósofo siempre se sienta en la misma silla). Solución del Camarero Una solución sencilla se logra mediante la introducción de un camarero en la mesa. Los filósofos deben solicitar su permiso antes de tomar cualquier tenedor. Debido a que el camarero es consciente de cual tenedor está en uso, es capaz de arbitrar y evitar un deadlock.
ALGUNAS POSIBLES SOLUCIONES Solución de Jerarquía de Recursos Otra solución sencilla se logra mediante la asignación de un orden parcial, o jerarquía, a los recursos (los tenedores, en este caso), y estableciendo la convención de que todos los recursos se solicitarán en orden, y serán puestos en libertad en orden inverso. En este caso, si cuatro de los cinco filósofos cogen simultáneamente sus tenedores con el número más bajo, sólo el tenedor con el número más alto seguirá sobre la mesa, por lo que el quinto filósofo no será capaz de coger ningún tenedor. Permitiendo comer a un filosofo que tendra acceso a los dos tenedores.
Solución del Camarero I #include #include #include #include //VARIABLES COMPARTIDAS char tenedores=5; char plato=0; char pedidos=0; //MUTEX inicializados estaticamente pthread_mutex_t mbandeja= PTHREAD_MUTEX_INITIALIZER; pthread_mutex_t mmostrador= PTHREAD_MUTEX_INITIALIZER; // Variables de condición pthread_cond_t cbandeja; pthread_cond_t cmostrador; pthread_cond_t ccamarero;
Solución del Camarero II void *llega_filosofo(int nombre) { while(1) { //Agarro plato o salgo pthread_mutex_lock(&mmostrador); if (plato==0) { pthread_cond_signal(&ccamarero); /*problema, pueden entrar los 5 signals de un tiron, pero solo devuelve el camarero un wait, solucion, contar los signals */ pedidos++; //aseguro exclusion mutua a esta variable con el mutex mmostrador printf("Filosofo (%d): CAMAREROO!!\n", nombre); pthread_cond_wait(&cmostrador, &mmostrador); } if (plato>=1) { plato--; printf("Filosofo (%d): COJO PLATO\n", nombre); }
Solución del Camarero III else { printf("Filosofo (%d): SI NO QUEDA COMIDA ME VOY\n", nombre); pthread_mutex_unlock(&mmostrador); pthread_cond_signal(&cmostrador); pthread_exit(NULL); } pthread_mutex_unlock(&mmostrador); //Agarro tenedores pthread_mutex_lock(&mbandeja); if(tenedores0) { pthread_mutex_lock(&mmostrador); pthread_cond_wait(&ccamarero,&mmostrador); for (i=0; i
View more...
Comments