<aside> 💡
Este proyecto no se hizo con heap. Cada dongle tiene su propia cola de prioridad donde solo entran 2 coders(Los dos que van a usar ese dongle).
El subject pedía:
El heap es una cola de prioridad que se organzia como un arbol binario. Para eso debe hacerse una sola cola para todos los dongles.
</aside>
Codexion es un proyecto de simulación concurrente diseñado para resolver variaciones del problema clasico de Dining Philosophers* aplicado a el entorno de desarrollo de software moderno.
La simulación consiste en un set de coders (hilos) que necesitan ejecutar tareas (Compile, Debug and Refactor). Para compilar, el coder debe contar con 2 dongles (recursos compartidos). El reto principal de este proyecto es gestionar la competencia por estos recursos basandose en una politica de arbitraje (FIFO Y EDF), evitar probelmas de sincronización y diseñar un hilo monitor que puenda detener la simulación ante el agotamiento (burnout).
Este fue el plan de acción que tomé para desarrollar el proyecto:
┌────────────────────┐
│ main() │
└─────────┬──────────┘
│
argc == 9 ?
┌─────────┴──────────┐
NO YES
┌──────────────┐ ┌──────────────┐
│ error + exit │ │ parseo │
└──────────────┘ └──────┬───────┘
│
┌───────────▼───────────┐
│ init desk/coders/ │
│ dongles │
└───────────┬───────────┘
│
┌───────────▼───────────┐
│ start_simulation() │
└───────────┬───────────┘
│
┌────────────────────────────┼────────────────────────────┐
│ │ │
┌───────▼────────┐ ┌──────────▼─────────┐ ┌──────────▼─────────┐
│ coder 1 thread │ │ coder 2 thread │ ... │ coder N thread │
└───────┬────────┘ └──────────┬─────────┘ └──────────┬─────────┘
│ │ │
│ (run_coder loop) │
└──────────────┬─────────────┴──────────────┬───────────┘
│ │
▼ ▼
┌──────────────────────┐ ┌──────────────────────┐
│ monitor thread │ │ shared state (desk) │
└──────────┬───────────┘ └──────────┬───────────┘
│ │
└────────────┬──────────────┘
▼
desk->end_simulation
coder thread
│
▼
LOCK mutex (dongle)
│
▼
pthread_cond_wait
│
├── unlock mutex (TEMPORAL)
│
├── sleep (espera señal)
│
└── re-lock mutex al despertar