6.5 Asignación de memoria no contigua.

Hasta ahora se han estudiado esquemas de administración de la memoria en los que los procesos se almacenan en posiciones contiguas (consecutivas) de memoria. Sin embargo, un proceso puede dividirse en bloques, y estos bloques pueden situarse en posiciones no contiguas de memoria principal. Es más, no es preciso que se encuentren en la memoria todos los bloques de un proceso para que se pueda ejecutar, basta con que se encuentren los bloques que contienen código o datos actualmente referenciados, el resto puede permanecer en memoria secundaria.

La memoria virtual

La clave del concepto de memoria virtual es la disociación de las direcciones a las que hace referencia un proceso en ejecución de las direcciones disponibles en la memoria principal.

Las direcciones a las que hace referencia un proceso en ejecución, en este esquema, se llaman direcciones virtuales. El intervalo de direcciones virtuales a las que puede hacer referencia un proceso en ejecución se llama espacio de direcciones virtuales, V, del proceso. El intervalo de direcciones reales de la memoria principal de un ordenador concreto se llama espacio de direcciones reales, R. El número de direcciones de V se denota |V|, y el número de direcciones de R, |R|. En los sistemas de almacenamiento virtual ya implantados lo normal es que |V| >> |R|, aunque se han construido sistemas en los que |V| < |R|.

La memoria virtual es una técnica de gestión de la memoria que posibilita que el espacio de direcciones virtuales sea mayor al espacio de direcciones reales. En otras palabras, se permite hacer programas de tamaño mayor al de la memoria principal. Para lograr esto, el sistema operativo se encarga de mantener en la memoria principal solamente aquellas partes del espacio de direcciones del proceso que actualmente están siendo referenciadas, el resto permanece en disco.

La memoria virtual se basa en el hecho de que muchos programas presentan un comportamiento conocido como operación en contexto, según el cual, en cualquier intervalo pequeño de tiempo un programa tiende a operar dentro de un módulo lógico en particular, sacando sus instrucciones de una sóla rutina y sus datos de una sóla zona de datos. De esta forma, las referencias de memoria de los programas tienden a agruparse en pequeñas zonas del espacio de direcciones. La localidad de estas referencias viene reforzada por la frecuente existencia de bucles: cuanto más pequeño sea el bucle, menor será la dispersión de las referencias. La observación de este comportamiento conduce al postulado (Denning, 1970) del llamado principio de localidad: "Las referencias de un programa tienden a agruparse en pequeñas zonas del espacio de direcciones. Estas zonas, además, tienden a cambiar sólo de forma intermitente".

La validez del principio de localidad varía de programa en programa: será, por ejemplo, más válido en programas que lleven a cabo accesos secuenciales a vectores que en programas que accedan a estructuras complejas de datos.

La memoria virtual se compagina con la multiprogramación. Al no tener que almacenar los procesos enteros en la memoria, pueden entrar más en la memoria principal, con lo que es más probable que siempre exista un proceso en estado listo. Por otro lado, cuando un proceso espera a que se cargue en la memoria principal parte de su código o datos, se inicia una E/S con el disco. Mientras dura dicha E/S la CPU puede ejecutar otro proceso.

Aunque los procesos sólo hacen referencia a direcciones virtuales, deben ejecutarse en la memoria real. Por lo tanto, durante la ejecución de un proceso es preciso establecer la correspondencia entre las direcciones virtuales y las reales. Como se verá más adelante esta correspondencia debe realizarse de una manera rápida, pues si no, se ralentizaría demasiado el tiempo de ejecución de los procesos.

Se han desarrollado varios métodos para asociar las direcciones virtuales con las reales. Los mecanismos de traducción dinámica de direcciones convierten la direcciones virtuales en direcciones reales en tiempo de ejecución. Todos estos sistemas tienen la propiedad de que las direcciones contiguas en el espacio de direcciones virtuales de un proceso no son necesariamente contiguas en la memoria principal. Esto se conoce como contigüidad artificial (fig. 6.8). Debe quedar claro que toda esta correspondencia es transparente al programador, que escribe sus programas en términos de direcciones consecutivas de memoria virtual.

 

6.5.1 Esquema general de traducción [DEIT93]

Los mecanismos de traducción dinámica de direcciones deben mantener mapas de correspondencia de traducción de direcciones que indiquen qué localidades de la memoria virtual están en memoria principal en un momento dado y dónde se encuentran.

Existen dudas en cuanto a si los bloques en que se dividen los procesos deben ser del mismo tamaño o de tamaños diferentes. Cuando los bloques son del mismo tamaño, se llaman páginas, y la organización de la memoria virtual correspondiente se conoce como paginación. Cuando los bloques pueden tener tamaños diferentes se llaman segmentos, y la organización de la memoria virtual correspondiente se llama segmentación. Algunos sistemas combinan ambas técnicas, con segmentos, que son entidades de tamaño variable, compuestas de páginas de tamaño fijo ( Segmentación paginada ).

Las direcciones en un sistema de correspondencia son bidimensionales. Para referirse a un elemento en particular, el programa especifica el bloque en el que se encuentra el elemento, y su desplazamiento a partir del inicio del bloque. Una dirección virtual, v, se denota por un par ordenado (b,d), donde b es el número de bloque en el que se encuentra el elemento al que se hace referencia, y d es el desplazamiento a partir del inicio del bloque.

La traducción de una dirección virtual v = (b,d) a una dirección real, r, se ejecuta de la siguiente forma (fig. 9). Cada proceso tiene su propia tabla de correspondencia de bloques, mantenida por el sistema operativo dentro de la memoria principal. Un registro especial dentro de la CPU, denominado registro de origen de la tabla de correspondencia de bloques, se carga con la dirección real, a, de la tabla de correspondencia de bloques del proceso durante el cambio de proceso. La tabla contiene una entrada por cada bloque del proceso, y las entradas siguen un orden secuencial para el bloque 0, el bloque 1, etcétera. Ahora se suma el número de bloque, b, a la dirección base, a, de la tabla de bloques, para formar la dirección real de la entrada del bloque b en la tabla de correspondencia de bloques. Esta entrada contiene la dirección real, b', de inicio del bloque b. El desplazamiento, d, se suma a la dirección de inicio del bloque, b', para formar la dirección real

deseada, r = b' + d.

  

Todas las técnicas de correspondencia de bloques empleadas en los sistemas de segmentación, paginación, y paginación y segmentación combinada son similares a la correspondencia mostrada en la figura 6.9.

Es importante señalar que la traducción de una dirección virtual a real la realiza una unidad hardware, que transforma todas las direcciones generadas por la CPU antes de que pasen al bus del sistema. Es esencial que esta transformación la realice el hardware, y no el sistema operativo, pues muchas instrucciones máquina incluyen referencias a memoria, y la correspondencia debe realizarse rápidamente, para no ralentizar en exceso el tiempo de ejecución de los procesos. Por ejemplo, las dos sumas indicadas en la figura 6.9 deben ser más rápidas que las sumas convencionales del lenguaje máquina.

Aunque el hardware consulta las tablas de correspondencia de bloques para la transformación de direcciones, es el sistema operativo el encargado de rellenar y gestionar dichas tablas. Un proceso no tiene por qué tener todos sus bloques en memoria principal, recuérdese que el espacio de direcciones virtuales puede ser muy superior al espacio de direcciones reales, esto hace que a veces un proceso referencie a una dirección de un bloque que no se encuentra en la memoria principal. Para detectar esto, las tablas de correspondencias tienen un "bit de presencia" por entrada (cada entrada representa un bloque), que indica si el bloque se encuentra presente en la memoria principal o no. El hardware de traducción debe verificar este bit en cada referencia a memoria.

Si el bloque no está en memoria principal, el hardware produce una interrupción. Esta interrupción provoca que el control pase al software (sistema operativo), para que éste inicie la transferencia del bloque que falta desde la memoria secundaria a la memoria principal, y actualice de acuerdo con ello la tabla de correspondencias. El proceso en ejecución se hará no listo hasta que se haya completado esta transferencia. La posición de los bloques en la memoria secundaria puede guardarse en la misma tabla de correspondencias.

ENLACE al tema anterior: INTERBLOQUEOS

ENLACE al siguiente tema: MEMORIA VIRTUAL