Este repositorio representa un trabajo de licenciatura para la materia de Programación Concurrente y se ha cargado a GitHub con fines educativos y de respaldo del programa, no se incluirá mantenimiento o soporte del mismo. |
---|
Este problema es un ejercicio clásico dentro de la informática, el problema fue creado por Edsger Dijkstra en el año 1965 con la intención de reflejar el problema sobre la sincronización de los procesos en los sistemas operativos.
El concepto fue basado en pensadores chinos, que comían utilizando dos palillos. Como descripción del ejercicio, tenemos cinco filósofos que están situados alrededor de una mesa y pasan el tiempo comiendo asi como pensando. Para cada filosofo, se tiene un platillo de fideos y un palillo situado a la izquierda de cada plato.
El objetivo es que los filósofos coman, pero para ello, requieren la utilización de dos palillos, por lo que cada filosofo puede tomar los que estén a su izquierda y derecha. Si el filosofo toma un tenedor y otro está ocupado, tendrá que esperar hasta que se desocupe para comer.
En caso de que los filósofos, tomen el palillo al mismo tiempo, causaría un interbloqueo, ya que ningún filosofo podrá comer, por lo que morirán de inanición por estar esperando de manera infinita.
Por lo que el objetivo a desarrollar es que se tiene que crear un algoritmo que evite que los filósofos mueran de inanición. Para ello se pueden optar por múltiples soluciones:
- Turno cíclico: El algoritmo inicia por un filósofo que quiera comer, pasa su turno al de la derecha y así sucesivamente, por lo que cada filósofo comería en su turno correspondiente. Pero si el número de filósofos es alto, uno de ellos morirá antes de su turno.
- Varios turnos: Se pueden definir varios turnos, cada filósofo de igual manera come en su turno y cada cierto tiempo se cambian las fichas.
- Colas de palillos: Se crea una lista de espera, y al filósofo que quiera comer, se agrega a la cola, si el palillo está libre, este puede tomarlo para posteriormente comer y dejar libres los palillos una vez termine de comer.
- Resolución de conflictos en colas de tenedores: Cada que un filósofo tome un palillo, deberá esperar un tiempo aleatorio para obtener el segundo, si en ese lapso no lo consigue, deberá soltar el que tiene y entrar a la cola nuevamente.
- El portero del comedor: Los filósofos deberán abandonar la mesa cuando ya no tengan hambre y cuando quieran comer pueden volver(sentándose en la misma silla). El mecanismo de este método es controlar el número de filósofos en la mesa, definiendo su número a n-1, ya que si hay n-1 filósofos tiene que haber por lo menos uno que pueda comer con sus dos palillos.
En este caso, se decidió implementar la solución por colas de palillos, donde el filósofo entra a una cola de espera cuando quiera comer, si el palillo izquierdo y derecho está disponible, este los tomará, caso contrario, esperará hasta que uno se libere para empezar a comer.
Además de que en el UI de la aplicación se muestra el log de eventos, para facilitar la compresión del algoritmo se implementaron dos indicadores gráficos y uno a través de texto.
Se muestran GIFs correspondientes al estado de cada filósofo:
Los palillos que se muestran en la mesa también cuentan con estados para que el programa muestre su estado:
Estado | Descripción |
---|---|
🔴 | Ocupado: El palillo se encuentra ocupado por otro filósofo, por lo que ningún filósofo a su lado debe usarlo |
🟢 | Libre: Es el estado inicial, el palillo se encuentra libre para usarse |
En el recuadro azul de la izquierda, se refleja un contador que mostrará la cantidad de veces que ha comido un filósofo de la mesa, por defecto, la aplicación está configurada para que cada filósofo coma 3 veces.
Para clonar este repositorio y lograr compilar este proyecto de forma local en tu computadora necesitas lo siguiente:
- Tener instalado el Kit de Desarrollo de Java (JDK) versión
>= 11.0
- Tener instalado algún IDE que permita trabajar con proyectos de Java
Se recomienda usar NetBeans, ya que es el IDE que se utilizó para el desarrollo y pruebas del programa
Primero, clona este repositorio y accede al directorio del proyecto:
git https://github.com/quiquereds/cenaFilosofos.git
cd cenaFilosofos
Una vez que estés dentro del directorio del proyecto, ábrelo usando tu IDE favorito. En el caso de haber elegido NetBeans, puedes abrir el IDE y acceder al proyecto abriendo el directorio como proyecto directamente en la interfaz
- Despliega los paquetes fuente (Source Packages)
- Accede al paquete de cena
- Abre el proyecto
interfaz.java
- Ejecuta el archivo
This work is licensed under Creative Commons Attribution 4.0 International