1. Por qué un simulador de semáforos
Los semáforos son difíciles de entender porque su comportamiento depende del orden en que los hilos ejecutan wait y post. Un hilo puede bloquearse, esperar en una cola, y despertarse más tarde. El estado del semáforo (el contador y la cola) cambia con cada operación, y es difícil de rastrear mentalmente.
Este simulador muestra el estado del semáforo (contador y cola de espera) y el estado de cada hilo (ejecutando, bloqueado, terminado) en cada paso. Permite experimentar con diferentes valores iniciales y secuencias de operaciones.
En la realidad, las operaciones de wait y post ocurren en cualquier orden y el estado del semáforo cambia rápidamente. El simulador permite ver cada operación paso a paso y entender por qué un hilo se bloquea o se despierta.
2. El modelo: hilos, contador y cola
El simulador modela un semáforo con:
- Contador: el número de permisos disponibles.
- Cola de espera: los hilos bloqueados esperando un permiso.
- Hilos: cada uno con un estado (ejecutando, bloqueado, terminado) y una secuencia de operaciones.
Cada hilo ejecuta una secuencia de operaciones: wait, post, o trabajo (que no afecta al semáforo). El simulador procesa las operaciones en orden de tiempo y actualiza el estado del semáforo y de los hilos.
3. Las operaciones del simulador
El simulador soporta tres operaciones:
| Operación | Efecto en el semáforo | Efecto en el hilo |
|---|---|---|
| wait | Decrementa el contador. Si es 0, el hilo se bloquea. | El hilo se bloquea o continúa. |
| post | Incrementa el contador. Despierta a un hilo bloqueado. | El hilo continúa. |
| trabajo | No afecta al semáforo. | El hilo hace trabajo (no se bloquea). |
4. Los estados de un hilo
Cada hilo puede estar en uno de estos estados:
| Estado | Descripción | Color |
|---|---|---|
| Ejecutando | El hilo está ejecutando una operación. | Verde |
| Bloqueado | El hilo hizo wait y el semáforo era 0. Espera en la cola. | Rojo |
| Terminado | El hilo completó todas sus operaciones. | Gris |
5. La visualización
El simulador muestra:
- El contador: el valor actual del semáforo, mostrado como un número y como una barra.
- La cola de espera: los hilos bloqueados, en orden FIFO.
- Los hilos: cada uno con su estado (ejecutando, bloqueado, terminado) y su operación actual.
- El log: la secuencia de operaciones ejecutadas, con el estado del semáforo en cada paso.
6. Casos de uso
El simulador permite explorar varios casos de uso:
- Semáforo binario (valor 1): solo un hilo a la vez. Equivalente a un mutex.
- Semáforo general (valor N): hasta N hilos concurrentes.
- Señalización (valor 0): un hilo espera a que otro lo señale.
- Productor-consumidor: un hilo produce, otro consume, con un buffer acotado.
7. Simulador interactivo
Este simulador muestra el estado del semáforo y de los hilos paso a paso. Ajusta el valor inicial y el número de hilos, y observa cómo cambia el estado:
Simulador · semáforo
| Paso | Hilo | Operación | Valor antes | Valor después | Estado del hilo |
|---|
8. Extensiones posibles
- Modo paso a paso: un botón «siguiente» que avanza una operación a la vez.
- Visualización de la cola: mostrar los hilos bloqueados en una cola visual.
- Productor-consumidor: simular el patrón completo con buffer acotado.
- trywait y timedwait: añadir operaciones sin bloqueo y con timeout.
- Barreras: simular pthread_barrier_wait.
9. Resumen
- El simulador muestra el estado del semáforo (contador y cola) paso a paso.
- Cada hilo puede estar en estado ejecutando, bloqueado o terminado.
- wait decrementa y bloquea si es 0; post incrementa y despierta.
- El simulador soporta semáforo binario, general y de señalización.
- Es la herramienta que cierra el bloque de semáforos.
10. Preguntas de repaso
Intenta responder cada una antes de abrir la respuesta.
1. ¿Qué muestra el simulador?
El estado del semáforo (contador y cola) y el estado de cada hilo paso a paso.
2. ¿En qué estados puede estar un hilo?
Ejecutando, bloqueado o terminado.
3. ¿Qué ocurre cuando un hilo hace wait y el semáforo es 0?
El hilo se bloquea y se añade a la cola de espera.
4. ¿Qué ocurre cuando un hilo hace post y hay hilos bloqueados?
Se incrementa el contador y se despierta al primer hilo de la cola.
5. ¿Qué modos soporta el simulador?
Binario (mutex), general (N permisos) y señalización (valor 0).
6. ¿Qué es la cola de espera?
Los hilos bloqueados esperando un permiso, en orden FIFO.
7. ¿Por qué es útil el simulador?
Porque permite ver el estado del semáforo y de los hilos en cada paso.
8. ¿Qué extensión permitiría simular productor-consumidor?
Añadir un buffer acotado y dos semáforos (vacíos y llenos).
9. ¿Qué bloque del curso cierra este simulador?
El bloque 5 (semáforos).
10. ¿Qué es trywait?
Intentar decrementar sin bloquear. Devuelve EAGAIN si no hay permisos.
Para practicar
- Ejecuta el simulador con valor inicial 1 y 4 hilos. Observa el bloqueo.
- Ejecuta con valor inicial 3 y observa que 3 hilos entran sin bloquearse.
- Ejecuta en modo señalización y observa el rendezvous.
- Modifica el simulador para añadir trywait.
- Implementa el productor-consumidor en el simulador.
- Investiga cómo se visualiza una barrera en el simulador.