martes, 5 de abril de 2022

Los filósofos comensales en Java

 Para poder entender cómo solucionar los problemas encontrados en el ejercicios de los filósofos comensales, se ha desarrollado un programa en java que permita emular aleatoriamente el comportamiento de los filósofos.

El programa está estructurado en clases cuya función es ejecutar instrucciones específicas a la problemática encontrada.

La clase principal llamada Filósofos se presenta de la siguiente forma.


Por otro lado, tenemos las clases mesa y la clase filósofos que nos permiten especificar el comportamiento que tendrán tanto los comensales como la posición que deben guardar los tenedores para poder ser utilizados.









Los filósofos comensales

 Enunciado





Cinco filósofos se pasan al rededor de una mesa y pasan su vida cenando y pensando. Cada filósofo tiene un plato de espagueti y un tenedor a la izquierda de su plato. Para comer el espagueti son necesarios dos tenedores y cada filósofo solo puede tomar el que se encuentra a su derecha y a su izquierda. Si cualquier filósofo coge un tenedor y el otro está ocupado se quedará esperando con el tenedor en su la mano hasta que pueda tomar el otro tenedor para luego empezar a comer.

Historia

Es un problema clásico de las ciencias de la computación propuesto por el científico Edsger Dijkstra para representar los inconvenientes que plantea la sincronización de procesos en un sistema operativo


Desarrollo

Si dos filósofos adyacentes intentan tomar el mismo palillo a la vez se produce una condición de carrera: ambos compiten por lo mismo pero uno se queda sin comer.

Si todos los filósofos cogen el palillo de su derecha al mismo tiempo, todos se quedarán esperando eternamente porque alguien debe liberar el palillo que les falta, cosa que nadie hará porque todos se encuentran en la misma situación (esperando que alguno deje su palillo). Llegado esto, los filósofos se morirán de hambre. A este bloqueo mutuo se le denomina interbloqueo o deadlock.

El objetivo consiste en encontrar un recurso que permita que los filósofos nunca se mueran de hambre. Porque:

– Dos filósofos contiguos no pueden comer a la vez (exclusión mutua).

– Si un filósofo está comiendo, los contiguos no pueden hacerlo hasta que aquél termine (sincronización).

– El filósofo que termina de comer debe ceder los palillos para su posterior utilización (interbloqueo).

Este sencillo planteamiento resulta muy útil para los que estudian informática porque ayuda a pensar en los sistemas que tienen recursos limitados (en el ejemplo anterior los palillos son limitados) y en los clientes (programas y usuarios): hay que darles servicio (comida) a todos en un tiempo razonable.

Se trata de que los recursos sean utilizados de la manera más eficiente por todos los procesos implicados. Hay algoritmos para solucionarlo pero todos los métodos pasan por asignar prioridades y/o tiempos máximos de uso de los recursos.

La finalidad es demostrar que se presentarán problemas ante la falta de una apropiada sincronización y evitar la peligrosa condición de carrera.


Los filósofos comensales en Java

 Para poder entender cómo solucionar los problemas encontrados en el ejercicios de los filósofos comensales, se ha desarrollado un programa ...