9 Proceso Paralelo y Exclusión Mutua
La gestión eficiente de recursos en sistemas operativos modernos requiere mecanismos robustos para manejar la ejecución concurrente y evitar conflictos en el acceso a recursos compartidos. Este documento profundiza en conceptos clave como la competencia entre procesos, el procesamiento paralelo y la exclusión mutua, ilustrando su relevancia mediante ejemplos prácticos y soluciones algorítmicas.
9.1 Competencia entre procesos: El dilema de los filósofos comensales
La competencia por recursos compartidos es un fenómeno inherente a los sistemas multiprogramables. Un ejemplo paradigmático es el problema de los filósofos comensales, formulado por Edsger Dijkstra en 1965. En este escenario, cinco filósofos alternan entre pensar y comer, requiriendo dos tenedores (recursos) para ingerir su comida. Si todos intentan tomar los tenedores simultáneamente, se genera un interbloqueo (deadlock), donde cada filósofo sostiene un tenedor mientras espera indefinidamente el otro.

Este problema modela situaciones reales, como transacciones bancarias concurrentes que acceden a la misma cuenta[^3]. Sin mecanismos de control, dos cajeros automáticos podrían retirar fondos simultáneamente, corrompiendo el saldo. La solución radica en implementar reglas de acceso ordenado, como asignar prioridades a los recursos o utilizar semáforos para serializar las operaciones.
9.2 Procesamiento Paralelo: Realidad vs. Ilusión
El procesamiento paralelo busca ejecutar múltiples tareas simultáneamente para mejorar el rendimiento. Sin embargo, su implementación varía según la arquitectura del hardware:
9.2.1 Paralelismo Real en Sistemas SMP
En sistemas multiprocesador simétricos (SMP), varios núcleos comparten memoria y dispositivos de E/S. Aquí, el paralelismo es tangible: un servidor con 8 núcleos puede ejecutar 8 hilos simultáneamente, acelerando tareas como renderizado 3D o análisis de datos.
9.2.2 Paralelismo Aparente en Sistemas Monoprocesador
En sistemas con un solo núcleo, no es posible ejecutar varios procesos al mismo tiempo. Sin embargo, gracias a la multiprogramación, el sistema operativo mantiene varios procesos cargados en memoria y los alterna rápidamente, creando la ilusión de que se ejecutan simultáneamente.
Esta técnica, conocida como concurrencia aparente, permite que, por ejemplo, un navegador web cargue imágenes mientras responde al teclado, aunque el procesador solo ejecuta una instrucción a la vez.
9.3 Exclusión Mutua
La exclusión mutua es un principio fundamental que asegura que solo un proceso a la vez pueda acceder a un recurso compartido. Esto es importante para evitar que múltiples procesos intenten modificar el mismo recurso simultáneamente, lo que podría causar errores o corrupción de datos. Para ser efectiva, debe cumplir cuatro criterios:
- Seguridad: Un único proceso en la sección crítica.
- Progreso: Si ningún proceso está en la sección crítica, alguien debe entrar.
- Equidad: Ningún proceso espera indefinidamente (inanición).
- Portabilidad: Independencia de la velocidad de ejecución de los procesos.
Un ejemplo claro de la necesidad de exclusión mutua ocurre en un sistema bancario. Imagina que dos cajeros automáticos, ubicados en diferentes lugares, intentan acceder al saldo de la misma cuenta bancaria para procesar retiros simultáneamente.
Sin un mecanismo de exclusión mutua, ambos cajeros podrían retirar dinero al mismo tiempo, lo que provocaría que el saldo sea incorrecto o incluso que se retire más dinero del disponible. La exclusión mutua garantiza que solo uno de los cajeros pueda acceder a la cuenta en un momento dado, bloqueando temporalmente el acceso del otro hasta que la operación haya finalizado.
Esto asegura que las transacciones se realicen de manera segura y consistente.
9.4 Sincronización: Coordinar para evitar el caos
La sincronización es el mecanismo que coordina la ejecución de múltiples procesos para asegurar que accedan a los recursos compartidos de manera ordenada y controlada. Sin la sincronización adecuada, los procesos podrían acceder a los recursos de forma desorganizada, lo que podría generar conflictos, errores o resultados inesperados.
Volviendo al ejemplo de los cajeros automáticos, la sincronización asegura que los procesos que intentan acceder al saldo de una cuenta se coordinen correctamente. Aunque la exclusión mutua previene que ambos cajeros accedan simultáneamente al saldo, la sincronización es lo que garantiza que los cajeros se coordinen y esperen su turno de manera ordenada. De esta forma, cuando un cajero completa su transacción, el otro puede acceder al saldo sin causar inconsistencias en la cuenta.
9.4.1 Importancia de la Sincronización
- Integridad de Datos: Previene condiciones de carrera, donde los resultados dependen del orden no controlado de ejecución de los procesos.
- Eficiencia: Permite que los procesos avancen de manera ordenada y se eviten bloqueos innecesarios, garantizando un uso óptimo de los recursos.
- Estabilidad del Sistema: Asegura que los procesos concurrentes no generen errores o comportamientos inesperados en el sistema operativo.
9.5 Interbloqueo en Sistemas Operativos
El interbloqueo es una situación en sistemas operativos donde un conjunto de procesos se encuentra en un estado de espera permanente, ya que cada uno está esperando que ocurra un evento que solo puede ser provocado por otro proceso del conjunto. Ninguno de los procesos puede avanzar porque todos dependen mutuamente de recursos que están siendo utilizados por los demás, entrando así en una espera indefinida.
9.5.1 Ejemplo Ilustrativo
Imagine una carretera de doble sentido que, en cierto punto, se estrecha debido a un puente que solo permite el paso de vehículos en un solo sentido. Si un vehículo entra desde cada extremo al mismo tiempo, ambos se encontrarán en el centro del puente. Ninguno puede avanzar porque el camino está bloqueado por el otro, y retroceder podría ser difícil o imposible. Ambos conductores esperan que el otro ceda el paso, pero si ninguno lo hace, se genera un interbloqueo y ambos vehículos quedan inmovilizados.
Este ejemplo refleja cómo, en un sistema operativo, procesos pueden quedar bloqueados esperando recursos que están siendo utilizados por otros procesos, sin posibilidad de que ninguno avance.
9.6 Condiciones para que ocurra un Interbloqueo
Para que un interbloqueo pueda producirse en un sistema operativo, deben cumplirse simultáneamente cuatro condiciones. Estas condiciones fueron formalizadas en 1971 por Edward Coffman y se conocen como las condiciones necesarias del interbloqueo:
Exclusión mutua:
Al menos un recurso debe estar en modo no compartido; es decir, solo un proceso puede utilizarlo a la vez. Si otro proceso necesita el recurso, debe esperar a que se libere.Posesión y espera:
Un proceso que posee al menos un recurso continúa esperando para adquirir recursos adicionales que están siendo ocupados por otros procesos.No apropiación:
Los recursos no pueden ser arrebatados a los procesos que los poseen; deben ser liberados voluntariamente por el proceso que los mantiene.Espera circular:
Debe existir una cadena de procesos tal que cada proceso está esperando un recurso que posee el siguiente proceso en la cadena, y el último espera un recurso del primero, formando un ciclo cerrado de espera.
9.6.1 Ejemplo Práctico: El “Abrazo Mortal”
Una representación clásica de la espera circular es el problema conocido como el abrazo mortal.
Imaginemos dos procesos:
- El proceso A posee el recurso 1 y necesita el recurso 2 para continuar.
- El proceso B posee el recurso 2 y necesita el recurso 1 para avanzar.
Ambos procesos quedan bloqueados, ya que cada uno espera indefinidamente que el otro libere el recurso que necesita. Esto muestra claramente cómo las cuatro condiciones pueden conducir a un interbloqueo real.