Síntesis final
Material de estudio basado en la edición de 2014. Borrador pendiente de revisión editorial independiente.
Síntesis Final: Comunicación y Sincronización
Conexión de conceptos
El tema aborda un problema central de los sistemas operativos: cómo permitir que procesos concurrentes cooperen correctamente sin producir errores ni bloqueos. Los conceptos se organizan en tres niveles interconectados.
Nivel 1: El problema de la concurrencia
Cuando procesos comparten recursos (variables, dispositivos), la ejecución concurrente produce race conditions debido a las copias temporales en registros. La solución es garantizar exclusión mutua en las secciones críticas.
Nivel 2: Mecanismos de solución
Semáforos resuelven la exclusión mutua mediante operaciones atómicas (wait/signal). Se usan para tres fines: exclusión mutua (inicialización en 1), conteo de recursos (inicialización en N) y sincronización (inicialización en 0). Su implementación requiere soporte de hardware (inhibición de interrupciones, test-and-set, swap).
Paso de mensajes combina sincronización e intercambio de información. En Unix se implementa como colas de bytes FIFO (pipes, named pipes, sockets). Las pipes son el mecanismo básico para comunicar procesos con parentesco, y los sockets permiten comunicación entre máquinas.
Señales de software trasladan las interrupciones de hardware al ámbito de proceso. Permiten notificaciones asíncronas de errores, dispositivos, temporizadores y otros procesos. La interfaz POSIX ofrece un control fino: programación de rutinas de atención, bloqueo temporal de señales y espera atómica con sigsuspend.
Nivel 3: Consecuencias no deseadas
Los deadlocks surgen cuando procesos cooperativos esperan recursos asignados a otros, formando bucles de espera. Las cuatro condiciones necesarias (exclusión mutua, retención y espera, no expropiación, espera circular) se previenen ordenando los recursos linealmente y pidiéndolos en orden creciente.
Relación entre mecanismos
Variables compartidas → Race conditions → Semáforos (exclusión mutua)
↓
Deadlocks (si el uso de semáforos no se gestiona correctamente)
Memoria no compartida → Paso de mensajes → Pipes/Sockets (comunicación)
↓
Señales (notificaciones asíncronas)
Errores frecuentes
- No cerrar file descriptors de escritura en pipes → deadlock padre-hijo.
- Usar espera activa en lugar de bloqueo → desperdicio de procesador.
- No considerar señales ya bloqueadas al usar
sigprocmask→ pérdida de señales. - Usar
pauseen lugar desigsuspend→ carrera entre verificación y espera. - Olvidar que las pipes son volátiles → pérdida de datos al hacer shutdown.
- No ordenar el pedido de recursos → deadlocks prevenibles.
Ideas clave integradas
- La atomicidad es el fundamento de semáforos y señales POSIX.
- Los semáforos son potentes pero propensos a errores de uso (deadlocks, inanición).
- El paso de mensajes ofrece una abstracción más alta que combina comunicación y sincronización.
- Las señales permiten reaccionar a acontecimientos asíncronos con control fino del bloqueo.
- Los deadlocks se previenen con disciplina en el orden de adquisición de recursos.
- El SO ofrece mecanismos; la corrección depende del diseño del programador.