← Concurrencia y Sincronización Bloque 2 · La sección crítica · Tema 10 de 47

Tema 10

Simulador de exclusión mutua

Los primeros intentos de exclusión mutua fallan por razones sutiles que son difíciles de ver a simple vista. Este simulador explora todos los estados posibles de cada algoritmo y muestra exactamente dónde se rompe: qué intercalado viola la exclusión mutua, cuál viola el progreso y cuál viola la espera acotada. Es la herramienta que permite verificar formalmente si una solución es correcta.

1. Por qué un simulador de exclusión mutua

Las condiciones de carrera son no deterministas: dependen del intercalado exacto, que cambia en cada ejecución. Un programa puede pasar mil pruebas y fallar en la mil uno. Por eso, la verificación por pruebas no es suficiente: hay que verificar todos los intercalados posibles.

El simulador de este tema hace exactamente eso: explora todos los estados posibles de cada algoritmo y verifica si cumple los tres requisitos (exclusión mutua, progreso, espera acotada). Si encuentra un estado que viola un requisito, lo muestra.

Este enfoque se llama verificación por exploración de estados (state space exploration) o model checking. Es la técnica que usan las herramientas profesionales (Spin, TLA+) para verificar protocolos de concurrencia.

Verificación formal vs. pruebas

Las pruebas ejecutan el programa con entradas específicas y verifican el resultado. La verificación formal explora todos los estados posibles y verifica que los requisitos se cumplen en todos. Las pruebas pueden pasar y el programa aún tener errores; la verificación formal es concluyente.

2. El modelo: estados y transiciones

El simulador modela cada algoritmo como una máquina de estados. Un estado es una configuración completa del sistema en un instante dado. Una transición es el cambio de un estado a otro cuando un hilo ejecuta una instrucción.

El simulador explora todos los estados alcanzables desde el estado inicial, siguiendo todas las transiciones posibles. Si encuentra un estado que viola un requisito, lo reporta.

El modelo simplifica el algoritmo a sus operaciones esenciales: leer, escribir y evaluar variables compartidas. No modela el código de la sección crítica (se asume que es arbitrario).

3. Qué es un estado

Un estado incluye:

Por ejemplo, para Peterson con dos hilos, un estado podría ser:

estado de Peterson
bandera[0] = 1, bandera[1] = 1, turno = 1
Hilo 0: en el while (esperando)
Hilo 1: en la sección crítica
Región crítica: Hilo 1

El número de estados crece exponencialmente con el número de hilos y variables, por eso el simulador se limita a dos hilos.

4. Cómo se verifica un algoritmo

El verificador explora todos los estados y verifica tres propiedades:

  1. Exclusión mutua: en ningún estado hay dos hilos en la sección crítica. seguridad
  2. Progreso: si ningún hilo está en la sección crítica y hay hilos que quieren entrar, existe al menos una transición que lleva a un hilo a la sección crítica. vivacidad
  3. Espera acotada: para cada hilo que quiere entrar, existe un límite finito de transiciones antes de que entre. equidad

Si alguna propiedad se viola, el verificador muestra el estado y la transición que la violan.

5. Los algoritmos a verificar

El simulador verifica cuatro algoritmos:

AlgoritmoVariablesRequisitos que cumple
Variable de turnoturnoExclusión mutua ✓, Progreso ✗, Espera acotada ✗
Bandera de intenciónbandera[0], bandera[1]Exclusión mutua ✗, Progreso ✓, Espera acotada ✓
Turno + banderaturno, bandera[0], bandera[1]Exclusión mutua ✓, Progreso ✓, Espera acotada ✗
Petersonturno, bandera[0], bandera[1]Exclusión mutua ✓, Progreso ✓, Espera acotada ✓

6. Verificación del intento 1: variable de turno

La variable de turno cumple la exclusión mutua pero viola el progreso y la espera acotada. El verificador encuentra un estado donde el hilo 1 quiere entrar pero no puede porque el turno es del hilo 0, y el hilo 0 no quiere entrar.

Estado que viola el progreso:

estado · violación de progreso
turno = 0
Hilo 0: en sección no crítica (no quiere entrar)
Hilo 1: quiere entrar (en protocolo de entrada)
Región crítica: vacía

→ El hilo 1 no puede entrar porque turno != 1, aunque la sección crítica esté libre.
→ Violación del progreso.

7. Verificación del intento 2: bandera de intención

La bandera de intención cumple el progreso y la espera acotada pero viola la exclusión mutua. El verificador encuentra un estado donde ambos hilos están en la sección crítica a la vez.

Estado que viola la exclusión mutua:

estado · violación de exclusión mutua
bandera[0] = 1, bandera[1] = 1
Hilo 0: en la sección crítica
Hilo 1: en la sección crítica

→ Ambos hilos levantaron sus banderas a la vez y pasaron el while.
→ Violación de la exclusión mutua.

8. Verificación del intento 3: turno + bandera

La combinación cumple la exclusión mutua y el progreso pero viola la espera acotada. El verificador encuentra un estado donde un hilo espera indefinidamente.

Estado que viola la espera acotada:

estado · violación de espera acotada
turno = 1, bandera[0] = 1, bandera[1] = 1
Hilo 0: quiere entrar, espera (turno == 1)
Hilo 1: entra y sale repetidamente

→ El hilo 1 puede entrar y salir indefinidamente, mientras el hilo 0 espera.
→ Violación de la espera acotada.

9. Verificación de Peterson

Peterson cumple los tres requisitos. El verificador explora todos los estados y no encuentra ninguna violación:

El verificador confirma que Peterson es correcto para dos hilos.

10. Simulador interactivo

Este simulador verifica los cuatro algoritmos y muestra los resultados:

Simulador · verificador de exclusión mutua

RequisitoResultadoExplicación

11. Extensiones posibles

12. Resumen

13. Preguntas de repaso

Intenta responder cada una antes de abrir la respuesta.

1. ¿Qué es la verificación por exploración de estados?

Explorar todos los estados posibles de un algoritmo y verificar que los requisitos se cumplen en todos.

2. ¿Qué es un estado en el simulador?

Una configuración completa del sistema: valores de variables compartidas, estado de cada hilo y región crítica.

3. ¿Qué es una transición?

El cambio de un estado a otro cuando un hilo ejecuta una instrucción.

4. ¿Qué algoritmos verifica el simulador?

Variable de turno, bandera de intención, turno + bandera, y Peterson.

5. ¿Qué algoritmo cumple los tres requisitos?

Peterson (para dos hilos).

6. ¿Qué viola la variable de turno?

El progreso y la espera acotada.

7. ¿Qué viola la bandera de intención?

La exclusión mutua.

8. ¿Qué viola la combinación de turno y bandera?

La espera acotada.

9. ¿Por qué la verificación formal es mejor que las pruebas?

Porque explora todos los estados, no solo los que se prueban. Las pruebas pueden pasar y el programa aún tener errores.

10. ¿Qué es model checking?

Una técnica de verificación formal que explora el espacio de estados de un sistema para verificar propiedades.

Para practicar

  1. Ejecuta el simulador para cada algoritmo y verifica los resultados.
  2. Dibuja el grafo de estados de la variable de turno.
  3. Explica por qué la verificación por exploración de estados es concluyente.
  4. Investiga qué es Spin y cómo se usa para verificar protocolos.
  5. Modifica el simulador para verificar un algoritmo de Lamport.
  6. Implementa la visualización del grafo de estados.