2.1.1. ¿Por qué es necesaria la sincronización?
Material de estudio basado en la edición de 2014. Borrador pendiente de revisión editorial independiente.
¿Por qué es necesaria la sincronización?
Resumen
Ejemplo: variable contador trabajo_pendiente
Se presenta un caso concreto para demostrar la necesidad de sincronización. Una variable compartida trabajo_pendiente indica cuántos trabajos de impresión están pendientes.
- Proceso usuario: incrementa
trabajo_pendientecada vez que envía un trabajo a la impresora. - Proceso gestor de la impresora: decrementa
trabajo_pendientecada vez que finaliza un trabajo.
Si la actualización se realiza sin restricciones, se generan inconsistencias (resultados erróneos).
El problema de las copias temporales
Una instrucción de alto nivel se traduce en múltiples instrucciones de máquina:
; Proceso usuario (RISC):
LOAD R0, trabajo_pendiente ; Copiar variable a registro
INC R0 ; Incrementar registro
STORE trabajo_pendiente, R0 ; Almacenar registro en variable
; Proceso gestor:
LOAD R1, trabajo_pendiente ; Copiar variable a registro
DEC R1 ; Decrementar registro
STORE trabajo_pendiente, R1 ; Almacenar registro en variable
Durante la ejecución, se realizan copias temporales en registros. Estas copias pueden ser inconsistentes con el valor real de la variable en memoria.
Dos situaciones erróneas
1. No impresión de un trabajo (pérdida)
Secuencia de fallo:
- Gestor carga
trabajo_pendiente(=3) en R1. - Gestor decrementa R1 (=2) → inconsistencia con memoria (=3).
- Cambio de contexto: gestor se interrumpe antes de STORE.
- Usuario carga
trabajo_pendiente(=3) en R0, incrementa (=4) y almacena. - Cuando el gestor reanuda, ejecuta STORE con R1=2 →
trabajo_pendiente= 2.
Resultado: se partió de 3, hubo un decremento y un incremento → debería ser 3, pero vale 2. Un trabajo no se imprimirá.
2. Intento de impresión de trabajo inexistente
Caso simétrico: el usuario es interrumpido antes de completar su incremento, y el gestor decrementa. El valor final queda en 4 (debería ser 3), provocando que el gestor intente imprimir un trabajo que no existe.
Solución: indivisibilidad
Si las operaciones de incremento/decremento se ejecutaran de manera atómica (indivisible), no habría inconsistencias. Una vez iniciada la actualización de una variable compartida, ningún proceso podría iniciar otra hasta que la primera finalice.
Race conditions (condiciones de carrera)
La ejecución concurrente no sincronizada de procesos con variables compartidas produce errores que dependen del planificador de procesos. Estas situaciones se denominan race conditions y deben erradicarse de los programas.
Ideas clave
- Las copias temporales en registros son la causa raíz de las inconsistencias.
- Una race condition genera resultados erróneos cuyo depende del orden de planificación.
- La indivisibilidad (atomicidad) de las operaciones sobre variables compartidas es la solución fundamental.
- Un cambio de contexto durante una actualización parcial produce datos inconsistentes.