Philosophers es un proyecto de la escuela 42 que simula el famoso problema de los filósofos comensales, un clásico problema de sincronización en sistemas operativos. El objetivo es implementar una solución que evite el deadlock y garantice que todos los filósofos puedan "comer" sin bloquearse indefinidamente, utilizando hilos (threads) o procesos (processes) y mecanismos de sincronización como mutexes.
- Simulación del problema: Cada filósofo es representado como un hilo o proceso que alterna entre pensar, comer y dormir.
- Sincronización: Uso de mutexes para controlar el acceso a los tenedores (recursos compartidos) y evitar condiciones de carrera.
- Manejo de tiempo: Cada acción (comer, pensar, dormir) tiene un tiempo específico, y el programa debe respetar estos tiempos.
- Gestión de deadlocks: Implementación de una solución que evite que los filósofos entren en un estado de deadlock.
- Modos de ejecución: El programa puede ejecutarse en dos versiones:
- Versión con hilos (
philo): Usa threads y mutexes. - Versión con procesos (
philo_bonus): Usa procesos y semáforos.
- Versión con hilos (
- Lenguaje: C
- Hilos y procesos: Uso de
pthread_create,pthread_join,fork,waitpid, etc. - Sincronización: Uso de
mutexpara la versión con hilos ysemáforospara la versión con procesos. - Manejo de tiempo: Uso de funciones como
gettimeofdayousleeppara gestionar los tiempos de ejecución.
- Concurrencia: Aprendizaje profundo sobre la programación concurrente y los problemas asociados.
- Sincronización: Implementación de mecanismos para evitar condiciones de carrera y deadlocks.
- Optimización: Mejora del rendimiento y eficiencia en la gestión de recursos compartidos.
- Depuración: Uso de herramientas como
valgrindpara detectar fugas de memoria y errores de sincronización.
- Clona el repositorio:
git clone https://github.com/tu-usuario/philosophers.git
- Compila el proyecto:
make
- Ejecuta el proyecto:
./philo <número_de_filósofos> <tiempo_para_morir> <tiempo_para_comer> <tiempo_para_dormir> [número_de_veces_que_cada_filósofo_debe_comer]
- Ejemplo de ejecucion:
./philo 5 800 200 200 7