La administración de memoria realiza un seguimiento del estado de cada ubicación de memoria, ya sea que esté asignada o libre. Asigna la memoria dinámicamente a los programas a petición de estos y la libera para su reutilización cuando ya no se necesita. La gestión de la memoria pretende satisfacer unos requisitos que debemos tener en cuenta.
Estos requisitos de gestión de memoria son:
- Reubicación: la memoria disponible generalmente se comparte entre varios procesos en un sistema de multiprogramación, por lo que no es posible saber de antemano qué otros programas residirán en la memoria principal en el momento de la ejecución de su programa. Intercambiar los procesos activos dentro y fuera de la memoria principal permite que el sistema operativo tenga un grupo más grande de procesos listos para ejecutar.
Cuando un programa se cambia a una memoria de disco, no siempre es posible que cuando se vuelve a cambiar a la memoria principal ocupe la ubicación de memoria anterior, ya que la ubicación aún puede estar ocupada por otro proceso. Es posible que necesitemos reubicar el proceso en un área diferente de la memoria. Por lo tanto, existe la posibilidad de que el programa se mueva en la memoria principal debido al intercambio.
La figura representa una imagen de proceso. La imagen del proceso ocupa una región continua de la memoria principal. El sistema operativo necesitará saber muchas cosas, incluida la ubicación de la información de control de procesos, la pila de ejecución y la entrada de código. Dentro de un programa, hay referencias de memoria en varias instrucciones y estas se denominan direcciones lógicas.
Después de cargar el programa en la memoria principal, el procesador y el sistema operativo deben poder traducir las direcciones lógicas en direcciones físicas. Las instrucciones de bifurcación contienen la dirección de la siguiente instrucción a ejecutar. Las instrucciones de referencia de datos contienen la dirección del byte o la palabra de los datos a los que se hace referencia.
- Protección: siempre existe el peligro cuando tenemos varios programas al mismo tiempo, ya que un programa puede escribir en el espacio de direcciones de otro programa. Por lo tanto, cada proceso debe estar protegido contra interferencias no deseadas cuando otro proceso intenta escribir en un proceso, ya sea accidental o incidentalmente. Entre la reubicación y el requisito de protección se produce una compensación, ya que la satisfacción del requisito de reubicación aumenta la dificultad de satisfacer el requisito de protección.
La predicción de la ubicación de un programa en la memoria principal no es posible, por eso es imposible comprobar la dirección absoluta en tiempo de compilación para garantizar la protección. La mayor parte del lenguaje de programación permite el cálculo dinámico de direcciones en tiempo de ejecución. El requisito de protección de la memoria debe ser satisfecho por el procesador en lugar del sistema operativo porque el sistema operativo difícilmente puede controlar un proceso cuando ocupa el procesador. Por lo tanto, es posible comprobar la validez de las referencias de memoria.
- Uso compartido: se debe tener un mecanismo de protección para permitir que varios procesos accedan a la misma parte de la memoria principal. Permitir que cada proceso acceda a la misma copia del programa en lugar de tener su propia copia separada tiene una ventaja.
Por ejemplo, varios procesos pueden usar el mismo archivo del sistema y es natural cargar una copia del archivo en la memoria principal y permitir que esos procesos la compartan. Es tarea de la administración de la memoria permitir el acceso controlado a las áreas compartidas de la memoria sin comprometer la protección. Los mecanismos se utilizan para respaldar las capacidades de compartición compatibles con la reubicación.
- Organización lógica: la memoria principal se organiza de forma lineal o puede ser un espacio de direcciones unidimensional que consta de una secuencia de bytes o palabras. La mayoría de los programas se pueden organizar en módulos, algunos de ellos no se pueden modificar (solo lectura, solo ejecución) y algunos de ellos contienen datos que se pueden modificar. Para manejar de manera efectiva un programa de usuario, el sistema operativo y el hardware de la computadora deben admitir un módulo básico para brindar la protección y el uso compartido requeridos. Tiene las siguientes ventajas:
- Los módulos se escriben y compilan de forma independiente y todas las referencias de un módulo a otro módulo son resueltas por el sistema en tiempo de ejecución.
- Los diferentes módulos están provistos de diferentes grados de protección.
- Existen mecanismos por los cuales los módulos pueden ser compartidos entre procesos. El uso compartido se puede proporcionar en un nivel de módulo que permite al usuario especificar el uso compartido que se desea.
- Organización física: la estructura de la memoria de la computadora tiene dos niveles denominados memoria principal y memoria secundaria. La memoria principal es relativamente muy rápida y costosa en comparación con la memoria secundaria. La memoria principal es volátil. Por lo tanto, la memoria secundaria se proporciona para el almacenamiento de datos a largo plazo, mientras que la memoria principal contiene los programas utilizados actualmente. La principal preocupación del sistema entre la memoria principal y la memoria secundaria es el flujo de información y no es práctico para los programadores entender esto por dos razones:
- El programador puede participar en una práctica conocida como superposición cuando la memoria principal disponible para un programa y sus datos puede ser insuficiente. Permite asignar diferentes módulos a la misma región de memoria. Una desventaja es que requiere mucho tiempo para el programador.
- En un entorno de multiprogramación, el programador no sabe cuánto espacio estará disponible en el momento de la codificación y dónde se ubicará ese espacio dentro de la memoria.
Referencia: Principios internos y de diseño, séptima edición de William Stallings