Problema de los filósofos cenando: planteamiento y solución de Edsger Dijkstra en 1965
1.
2. En 1965, Dijkstra planteo y resolvió un problema de
sincronización al que llamo problema de la cena de
filósofos, el problema tiene un planteamiento muy
sencillo.
Cinco filósofos están sentados alrededor de una mesa
circular. Cada filosofo tiene ante si un plato de
espagueti. El espagueti están resbaloso que un
filosofo necesita dos tenedores para comerlo. Entre
cada par de platos ay un tenedor.
3. La vida de un filosofo
consiste en periodos
alternantes de comer y
pensar.
Cuando un filosofo siente
hambre, trata de adquirir
sus tenedores izquierdo y
derecho, uno a la vez o en
cualquier orden si logra
adquirir los dos
tenedores, comerá por un
rato, luego pondrá los
tenedores en la mesa y
seguirá pensando.
4. El procedimiento take_fork (tomar tenedor) espera hasta
que el tenedor especifico este disponible y luego se
apodera de el.
Supongamos que todos los científicos toman su tenedor
izquierdo simultáneamente. Ninguno podrá tomar su
tenedor derecho, y tendremos un bloqueo mutuo.
Una situación así, en la que todos los programas sigan
ejecutándose de manera indefinida pero no logran avanzar
se denominan inanición.
En la practica, empero, tiene un problema de rendimiento:
Solo un filosofo puede estar comiendo en un instante
dado. Si hay cinco tenedores disponibles deberíamos estar
en condicione s de permitir que dos filósofos comieran al
mismo tiempo.
5. E programa utiliza un arreglo de
semáforos, uno por filosofo de modo que los
filósofos hambrientos pueden bloquearse si
los tenedores que necesitan están ocupados.
Cada proceso ejecuta el procedimiento
filosofo como código principal, pero los
demás procedimientos, tomar
tenedores, poner tenedores y probar son
procedimientos ordinarios y no procesos
apartes.