Memoria virtual
Debido a que muchas aplicaciones requieren el acceso a más información que la que se puede mantener en memoria física. Enlos sistemas operativos modernos deve surgir el concepto de memoria virtual, que permite al software usar mas memoria principal de la que realmente posee una computadora.
En un sistema operativo sin memoria virtual, lo que el sistema hace es dividir la memoria principal en pedazos y asigna cada pedazo a cada programa que se este ejecutando en un instante determinado.
en la sigiente imagen se ve que pasa en la memoria principal cuando se ejecuta un solo programa y tambien cuando se ejecutan varios a la vez en un mismo instante.

Como pueden observar la distribucion de la memoria en
contigua, es todo un espacio junto, no hay distintos espacios disjuntos por la memoria principal para un mismo programa, eso implica a una complicacion, porque al no poder
dividir en segmentos la memoria para un mismo programa, si hay unas celdas que interrumpen el espacio que queramos usar no se va a poder ejecutar el programa ya que no estara cargado en la memoria principal.
En el caso de la memoria virtual no es nesesario que existan estas contiguidades, asi que podesmos dividir en segmentos los espacios que usara la memoria fisica para un misma programa sin problemas.
Concepto de Memoria virtual
La memoria virtual utiliza dos niveles de jerarquia de memoria: la memoria principal y una memoria de respaldo que suele ser el HDD o tambien una memoria expandida.
Sobre la memoria de respaldo se establece un mapa uniforme de memoria virtual. Las direcciones generadas por el procesador se refieren a este mapa virtual, pero, sin embargo, los accesos reales se realiza sobre la memoria principal.
Para su funcionamiento, la memoria virtual exige una gestión automática de la parte de la jerarquía de memoria formada por los niveles de memoria principal y de disco (de eta automatizacion se encarga el sistema operativo con ayuda del hardware).
esta gestión incluye toda la memoria principal y una parte del disco, que sirve de respaldo a la memoria
virtual.Los aspectos principales en los que se basa la memoria virtual son los siguientes:- Las direcciones generadas por las instrucciones máquina, tanto para referirse a datos como a otras instrucciones, están referidas al espacio virtual, es decir, forman parte del mapa de memoria virtual. En este sentido se suele decir que el procesador genera direcciones virtuales
- Las direcciones generadas por las instrucciones máquina, tanto para referirse a datos como a otras instrucciones, están referidas al espacio virtual, es decir, forman parte del mapa de memoria virtual. En este sentido se suele decir que el procesador genera direcciones virtuales
- Aunque el programa genera direcciones virtuales, para que éste pueda ejecutarse, han de residir en memoria principal las instrucciones y los datos utilizados en cada momento. Si, por ejemplo, un dato referenciado por una instrucción máquina no reside en la memoria principal es necesario realizar un trasvase de información (migración de información) entre el disco y la memoria principal antes de que el programa pueda seguir ejecutando.
- Los espacios virtual y físico se dividen en páginas. Se denominan páginas virtuales a las páginas del espacio virtual, paginas de intercambio a las páginas residentes en el disco y marcos de página a los espacios en los que se divide la memoria principal.
- Cada marco de página es capaz de albergar una página virtual cualquiera, sin ninguna restricción de direccionamien to.
- Existe una unidad hardware, denominada MMU (Memo Management Unit), que traduce las direcciones virtuales a direcciones de memoria principal. Aplicando lo visto anteriormente, se puede decir que esta traducción se restringe a traducir el número de página virtual en el correspondient e número de marco de página.
Esta traducción hay que hacerla por hardware dada la alta
velocidad a la que debe hacerse (una fracción del tiempo de acceso de la memoria principal). - Dado que en cada instante determinado solamente reside en memoria principal una fracción de las páginas del programa, la traducción no siempre es posible. Por tanto, la MMU producirá una excepción de fallo de página cuando ésta no esté en memoria principal.
Los fallos de página son atendidos por el sistema operativo (o sea los atiende el software) que se encarga de realizar la adecuada migración de páginas, para traer la página requerida por el programa a un marco de página. Se denomina
paginación al proceso de migración necesario para atender los fallos de pagina.
El tamaño del espacio virtual suele ser muy grande. En la actualidad se emplean direcciones de 32, 48 o hasta 64 bits, lo que significa
espacios virtuales de 232, 248 y 264 bytes. Dado que los programas requieren en general mucho menos espacio, una de las funciones que realiza el sistema operativo es la
asignación de espacio virtual a los programas para su ejecución. El programa no podrá utilizar todo el
espacio virtual sino que ha de restringirse a la zona o zonas que le asigne el sistema operativo.
La figura muestra que el espacio virtual reservado al programa A puede estar en una única zona o puede estar dividido en varias zonas, que se denominan segmentos.Tabla de paginas
La tabla de páginas es una estructura de información que contiene la información de dónde residen las páginas de un programa en ejecución. Esta tabla permite, por tanto, saber si una página esta en memoria principal y, en su caso, en que marco específico reside.
Según se ha visto anteriormente, dado que el tamaño del espacio virtual suele ser muy grande, el tamaño de la correspondient
e tabla de páginas puede ser muy grande (de millones de elementos). Sin embargo, como hemos visto, el sistema operativo se encarga de asignar a cada programa en ejecución un espacio virtual de tamaño ajustado a su: necesidades. De esta forma, la tabla de páginas queda reducida al valor necesario para que ejecute el programa.
La Figura muestra la solución más sencilla de tabla de páginas de un nivel. En este caso se supone que toda la memoria asignada al programa es contigua. El número de la página virtual se utiliza como índice para entrar en la tabla. Cada elemento de la tabla tiene un bit para indicar si la página está en memoria principal y el número de marco en el que se
encuentra la mencionada página o un valor nulo.
La Figura muestra un ejemplo de traducción para el caso de tabla de paginas de un nivelSe supone que las página son de 2 KB, por lo que los 11 bits inferiores de la
dirección virtual sirven para especificar el byte dentro de la pagina, mientras que el resto especifican la página virtual, que en este caso es la 5. Entrando en la posición N0 5 de la tabla observamos que la página está en memoria principal y que esta en el marco numero 6.738.
Concatenando el número de marco con los 11 bits inferiores de la dirección virtual se obtiene la dirección de memoria principal donde reside la información buscada.
El mayor inconveniente de la tabla de un nivel es su falta de flexibilidad. Toda la memoria virtual asignada ha de ser contigua (El espacio virtual asignado es contiguo, pero no los marcos de pagina que pertenezcan en un momento dado, ya que estaran dispersos por toda la memoria principal) y la ampliación de memoria asignada solamente puede hacerse final de la existente.
Sin embargo, los programas están compuestos por varios elementos, como son el propio programa objeto, la pila y los bloques de datos. Además, tanto la pila como los bloques de datos han de poder crecer. Por ello, un esquema de tabla de un nivel obliga a dejar grandes huecos de memoria virtual sin utilizar , pero que están presentes en la tabla con el consiguiente
desperdicio de espacio.
Por ello se emplean esquemas de tablas de páginas de más de un nivel. Con este tipo de tabla, la memoria asignada esta compuesta por una serie de bloques de memoria virtual, es decir, por unos segmentos.
Cada segmento está formado por una serie contigua de byte. que puede variar su tamaño, siempre y cuando no choque con otro segmento. La dirección se divide en tres partes.
La primera identifica el segmento de memoria donde esta la información que se desea acceder. Con este valor se entra en una subtabla de segmentos, que contiene un puntero por segmento,
puntero que indica el comienzo de la subtabla de paginas del segmento.
Con la segunda parte de la dirección se entra en la subtabla de páginas seleccionada. Lo que permite obtener el marco en el que está la información
deseada.

Se ha añadido a cada subtabla su tamaño. De esta forma se detectan las llamadas
violaciones de memoria, producidas cuando el programa en ejecución intenta acceder una dirección que no pertenezca a los espacios asignados por el sistema operativo.
La ventaja del diseño con varios niveles es que permite una asignación de memoria más flexible que con un solo nivel, puesto que se pueden asignar bloques de memoria virtual disjuntos, por lo que pueden crecer de forma a independiente. Además, la tabla de páginas no tiene espacios vacíos, por lo que ocupa solamente el espacio imprescindible
.
Las computadoras actuales suelen proporcionar tablas de varios niveles, algunos llegan hasta cuatro, con lo que se consigue una mayor flexibilidad en la asignación de espacio de memoria.
La Figura muestra un ejemplo de traducción mediante tabla de páginas de dos niveles. El segmento direccionado es el 5, por lo que hay que leer la entrada 5 de la tabla de segmentos.
Con ello se obtiene la dirección donde comienza la tabla de páginas de este segmento. La página direccionada es la 3, por lo que entramos en el elemento 3 de la tabla anterior. En esta tabla encontramos que el marco es el Hex4A24, por lo que se puede formar la dirección física en la que se encuentra la información buscada.Traduccion de direccionesLa asignación de memoria y, por tanto, la construcción de la tabla de páginas es misión del sistema operativo. Sin embargo, es la MMU la que se encarga de realizar la traducción de las direcciones.
Esta división de trabajo es necesaria puesto que la traducción de direcciones hay que hacerla de forma muy rápida para que no afecte negativamente al tiempo de acceso a la memoria.
Para que una computadora con memoria virtual pueda competir con una sin
memoria virtual, la traducción ha de tardar una fracción del tiempo de acceso a memoria. En caso contrario, sería mucho más rápido y por ende mas económico el sistema sin memoria virtual.
Suponiendo una memoria principal de 100 ns y un traductor de 5 ns, el tiempo de acceso para el caso de memoria virtual es de 105 ns, es decir, un 5 por 100 más lento que en el caso de no tener memoria virtual. Sin embargo, si la traducción tardase 100 ns, la computadora con memoria virtual sería la mitad de rápida, algo que la haría imposible de competir.
La tabla de páginas es una estructura que mantiene el sistema operativo y que
reside en memoria principal (a veces, hay una parte en la propia MMU y otra en memoria principal). Esto parece un contrasentido, puesto que para acceder a memoria hay que traducir la dirección virtual, lo que supone realizar un acceso a memoria por cada nivel que
tenga la tabla de páginas. Según se ha visto, esto suponía un retardo inadmisible en los accesos a memoria. Para resolver este problema se dota a la MMU de una memoria muy rápida que permite hacer la traducción para la mayoría de los casos en una fracción del tiempo que se tarda en acceder a la memoria principal.
nota: La memoria muy rapida incluida en la MMU para realizar la traduccion de direcciones es una memoria asosiativa que se denomina TLB (traslation lookaside buffer) . en esta memoria se encuentran almacenadas las parejas paginas-marco de las paginas mas recientementa accedidas.
En caso de no encontrarse la pagina mas reciente en la TLB, es nesesario acceder a ñla tabla de paginas con el tiempo que esto conlleva.
Por lo tanto la taza de acierto de la MMU debera de ser elevada, para que el tiempo medio efectivo de traduccion sea menor al de acceso a la memoria principal.
Ejemplo de traducciones incorrectasFinalmente, hay que destacar que la encargada de mantener la información de que página están sucias es la MMU. En efecto, al mismo tiempo que hace la traducción, en caso de que acceso sea de escritura marca a esa pagina como sucia.
nota: La MMU cuando encuentra uan pagina sucia lo guarda en la TLB y luego esta informacion se escribe en la tabla de paginas para que el sistema operativo sepa sobre esto cuando haga la migracion de paginas.Caso de varios programas activos
Los sistemas operativos permiten que existan varios programas
activos en un mismo tiempo. De estos programas solamente puede haber uno en ejecución en cada instante, encargándose el sistema operativo de ir poniendo en ejecución uno detrás de otro de forma ordenada. Sin embargo, cada uno de los programas ha de tener asignado un espacio de
memoria, por lo que ha de tener su propia tabla de páginas.
La MMU ha de utilizar la tabla de paginas correspondient
e al programa que está en ejecución. Para ello, el procesador tiene un
registro
identificador de espacio de direccionamien to (RIED). Este registro contiene la dirección en la cual está almacenada la tabla de índices o segmentos del programa.
Cuando el sistema operativo pone en ejecución un programa ha de actualizar el valor del RIED para que apunte a la tabla de páginas adecuada.
Asignacion de memoria principal y memoria virtual
En un sistema con memoria virtual, un programa en ejecución tiene asignado un espacio virtual, parte del cual reside en unos marcos de pagina de la memoria principal.
El objetivo de la políticas de extracción y de reemplazo que utilice el sistema operativo para hacer la migración de información entre el intercambio y la memoria principal tiene como objetivo conseguir, con el mínimo trabajo posible, que estén en cada momento en memoria
principal las páginas que necesitan los programas en ejecución.
Se denomina conjunto de trabajo (working set) W(k,q) de un programa en ejecución en el intervalo [k;q] al conjunto de páginas referenciadas entre el elemento k y el q de su traza.
Por otro lado, se denomina conjunto residente R(t) a la parte del proceso que está realmente almacenada u memoria principal en el instante t.
El registro RIED permite determinar la tabla de páginas en uso.Supóngase que en el instante t el programa está por su referencia k y que el conjunto residente R(t) coincide con el conjunto de trabajo W(k,q). Esto significaría que ese programa tiene la garantía de que sus próximas q — k referencias se refieren a pagina: que están en memoria principal, por lo que no se generaría ningún fallo de página.
Dado que el sistema operativo no conoce de antemano cuales van a ser las referencias que generará un programa, ha de basarse en la trayectoria pasada de la ejecución del mismo para mantener un conjunto reciente que sea lo más parecido posible a su futuro conjunto de trabajo, para así minimizar la paginación.
Gran parte de este articulo fua extraido de "Sistemas operativos: una vision aplicada."