Optimización de Sistemas Operativos Mediante la Compartición de Recursos de Software
¿Qué es la Compartición de Recursos de Software?
Compartir un recurso de software significa permitir que dos o más procesos utilicen una misma rutina o dato almacenado en memoria. La rutina o el dato es el recurso que se comparte entre los procesos.
Beneficios de la Compartición de Recursos
La compartición de recursos de software incrementa la flexibilidad y eficiencia de un sistema operativo, ya que aumenta su capacidad para atender procesos simultáneamente. Es especialmente necesaria en sistemas operativos multiusuario y multitarea, porque generalmente existe un único recurso físico o lógico al que múltiples procesos necesitan acceder.
Muchos sistemas modernos, como las redes de computadoras, los sistemas distribuidos, la Web y el groupware, fundamentan su operación en la compartición de recursos (procesos, periféricos, datos, etc.). Además, la compartición puede contribuir al balanceo de carga entre los procesos.
Requisitos para la Compartición de Recursos de Software
Para implementar la compartición de recursos de software, se deben cumplir ciertos requisitos:
- El sistema operativo debe permitir la repetición de apuntadores en las tablas de segmento o de página.
- Si la compartición es dinámica, se requiere que el sistema operativo soporte carga/descarga dinámica y ligado dinámico. Esto a menudo implica el uso de tablas auxiliares como:
- ART (Tabla de Referencia Activa)
- AST (Tabla de Segmento Activa)
- SMT (Tabla de Mapeo de Segmentos)
- Los procesos deben estar diseñados para soportar la compartición.
- Los procesos deben saber que el recurso está siendo compartido.
- Es indispensable que los procesos puedan comunicarse entre sí (IPC – Inter-Process Communication) para coordinar el acceso a cualquier recurso compartido.
- Los derechos de los usuarios sobre los recursos deben prevalecer durante una sesión.
Tipos de Recursos y Asignación
Tipos de Recursos
Los recursos pueden clasificarse como:
- Recursos Dedicados: Se asignan a un único proceso por el tiempo que este los requiera. El proceso es responsable de liberar el recurso. Generalmente utilizan memoria estática, aunque también pueden usar memoria dinámica o espacio de almacenamiento físico.
- Recursos Compartidos: Pueden ser utilizados por múltiples procesos.
Formas de Asignación de Recursos Compartidos
Los recursos compartidos pueden asignarse de dos maneras básicas:
- Uno a la vez: El recurso se asigna a un solo proceso/usuario en un momento dado. El uso es intercalado entre los procesos que lo solicitan (compartición lógica o temporal).
- Muchos a la vez: Varios procesos acceden al recurso simultáneamente (compartición real). Por ejemplo, una página de memoria puede ser asignada a muchos programas, o un archivo puede ser abierto por múltiples procesos (con las debidas precauciones).
Consideraciones Adicionales en la Compartición
Para gestionar la compartición de recursos, es necesario considerar:
- Usuarios (u)
- Derechos (d) de acceso de cada usuario sobre cada recurso.
- Recursos (r) disponibles.
Esto a menudo requiere una estructura de datos (como una matriz de acceso o base de datos) que relacione usuarios, recursos y derechos (n x m x r).
Al compartir recursos, es común que se generen colas (listas de espera) de procesos que aguardan por el acceso al recurso.
Problemas Comunes en la Compartición
El principal desafío de la compartición es gestionar la concurrencia, es decir, el acceso simultáneo o intercalado de múltiples procesos a un mismo recurso. Esto puede llevar a problemas como:
- Condiciones de carrera: Cuando el resultado de una operación depende del orden impredecible en que los procesos accedan al recurso.
- Interbloqueo (Deadlock): Ocurre cuando dos o más procesos compiten por recursos y cada uno espera por un recurso que está retenido por otro, creando un ciclo de espera del que no pueden salir.
Es fundamental cuidar la consistencia y la integridad de los datos y del estado del recurso compartido.
Mecanismos y Técnicas de Compartición
Los mecanismos básicos para implementar la compartición incluyen:
- Uso de estructuras de datos como tablas (ej. tablas de páginas/segmentos).
- Semáforos: Para controlar el acceso y asegurar exclusión mutua.
- Listas ligadas: Para gestionar colas de espera.
Cada recurso puede definir su propia forma o política de compartición. Por ejemplo, en sistemas de tiempo compartido, a un proceso se le puede asignar la CPU por un intervalo de tiempo fijo llamado quantum.
Requisitos a Nivel de Proceso
Reentrancia y Procesos Puros
La base fundamental para compartir recursos es que los procesos involucrados puedan soportarlo. Para que los recursos (especialmente el código) sean compartidos eficientemente en un sistema de multiprogramación, los procesos deben ser concurrentemente reutilizables, también llamados procesos puros.
Un proceso puro opera solamente sobre variables locales (registros del CPU) o sobre datos ubicados en segmentos asociados específicamente con la tarea (datos privados); nunca se modifican a sí mismos (su propio código). Ejemplo clásico: Archivos Ejecutables (EXE) bien diseñados.
Los procesos reentrantes son aquellos cuyo código puede ser utilizado por varios procesos simultáneamente sin interferir entre ellos. Pueden obtener datos y memoria fuera de su segmento de código. Un programa necesita ser reentrante para ser eficientemente concurrente y compartible.
- Ejemplo de No Reentrante: Archivos de Comando (COM) en MS-DOS, tradicionalmente el uso de CGI.
- Ejemplo de Reentrante: Los Servlets en Java, las funciones recursivas (porque típicamente usan memoria dinámica en la pila para cada invocación).
Sincronización y Protección
Los procesos necesitan mecanismos de protección y sincronización (como semáforos, mutex, monitores) para garantizar el uso correcto y seguro de los recursos compartidos, evitando condiciones de carrera y manteniendo la integridad de los datos.
Procesos Bloqueantes
Para una buena compartición, es preferible que los procesos sean bloqueantes, es decir, que puedan detener su ejecución voluntariamente (bloquearse) mientras esperan que un recurso esté disponible o que ocurra un evento específico, liberando así la CPU para otros procesos.
Responsabilidad y Supervisión
Los procesos deben responsabilizarse de usar correctamente los mecanismos de compartición, bajo la supervisión del sistema operativo. De lo contrario, un proceso podría monopolizar un recurso (inanición) o causar interbloqueos.
Asignación Estática vs. Dinámica
Recursos Compartidos Asignados Estáticamente
Se habla de compartición estática cuando los recursos compartidos (como rutinas o datos) se cargan completamente en memoria desde el inicio de la ejecución de los procesos que los usarán. Permanecen en memoria durante toda la ejecución.
Ejemplo: Rutinas del servicio de Interrupción del BIOS o de MS-DOS.
Recursos Compartidos Asignados Dinámicamente
La compartición dinámica consiste en cargar en memoria solo la parte requerida del recurso compartido cuando un proceso la necesita. Si se requiere código o datos que no están en memoria, estos serán cargados durante la ejecución.
Ejemplo: Bibliotecas de enlace dinámico (DLLs), componentes gráficos del sistema operativo como los cuadros de diálogo estándar de Windows.
Métodos Principales para la Compartición de Memoria
Existen dos métodos fundamentales para compartir memoria (que es un recurso de software clave), basados en la forma de direccionamiento del sistema operativo:
- Segmentos Compartidos
- Paginación Compartida
Segmentación Compartida
Este método consiste en que varios procesos pueden tener entradas en sus respectivas tablas de segmentos (asociadas con su PCB – Process Control Block) que apuntan a la misma sección física de memoria (el segmento compartido).