4.4. La memoria virtual: los detalles
Primero, debemos introducir un nuevo concepto: espacio de direcciones virtuales. El espacio de direcciones virtuales es el espacio de direcciones m�ximo disponible para una aplicaci�n. El espacio de direcciones virtuales varia de acuerdo a la arquitectura del sistema y del sistema operativo. El espacio de direcciones virtuales depende de la arquitectura puesto que es la arquitectura la que define cu�ntos bits est�n disponibles para prop�sitos de direccionamiento. El espacio de direcciones virtuales tambi�n depende del sistema operativo puesto que la forma en que el sistema operativo fue implementado puede introducir l�mites adicionales sobre aquellos impuestos por la arquitectura.
La palabra "virtual" en el espacio de direcciones virtuales, significa que este es el n�mero total de ubicaciones de memoria direccionables disponibles para una aplicaci�n, pero no la cantidad de memoria f�sica instalada en el sistema, o dedicada a la aplicaci�n en un momento dado.
En el caso de nuestra aplicaci�n de ejemplo, su espacio de direcciones virtuales es de 15000 bytes.
Para implementar la memoria virtual, para el sistema es necesario tener un hardware especial de administraci�n de memoria. Este hardware a menudo se conoce como un MMU (Memory Management Unit). Sin un MMU, cuando el CPU accede a la RAM, las ubicaciones reales de RAM nunca cambian — la direcci�n de memoria 123 siempre ser� la misma direcci�n f�sica dentro de la RAM.
Sin embargo, con un MMU, las direcciones de memoria pasan a trav�s de un paso de traducci�n antes de cada acceso de memoria. Esto significa que la direcci�n de memoria 123 puede ser redirigida a la direcci�n f�sica 82043 en un momento dado y a la direcci�n 20468 en otro. Como resultado de esto, la sobrecarga relacionada con el seguimiento de las traducciones de memoria virtual a f�sica ser�a demasiado. En vez de esto, la MMU divide la RAM en p�ginas — secciones contiguas de memoria de un tama�o fijo que son manejadas por el MMU como unidades sencillas.
Mantener un seguimiento de estas p�ginas y sus direcci�nes traducidas puede sonar como un paso adicional confuso e innecesario, pero de hecho es crucial para la implementaci�n de la memoria virtual. Por tal raz�n, considere el punto siguiente:
Tomando nuestra aplicaci�n hipot�tica con un espacio de direcciones virtuales de 15000 bytes, asuma que la primera instrucci�n de la aplicaci�n accede a los datos almacenados en la direcci�n 12374. Sin embargo, tambi�n asuma que nuestra computadora solamente tiene 12288 bytes de RAM f�sica. �Qu� pasa cuando el CPU intenta acceder a la direcci�n 12374?
Lo que ocurre se conoce como un fallo de p�gina.
4.4.1. Fallos de p�gina
Un fallo de p�gina es la secuencia de eventos que ocurren cuando un programa intenta acceder a datos (o c�digo) que est� en su espacio de direcciones, pero que no est� actualmente ubicado en la RAM del sistema. El sistema operativo debe manejar los fallos de p�gina haciendo residentes en memoria los datos accedidos, permitiendo de esta manera que el programa continue la operaci�n como que si el fallo de p�gina nunca ocurri�.
En el caso de nuestra aplicaci�n hipot�tica, el CPU primeramente presenta la direcci�n deseada (12374) al MMU. Sin embargo, el MMU no tiene traducci�n para esta direcci�n. Por tanto, interrumpe al CPU y causa que se ejecute un software, conocido como el manejador de fallos de p�gina. El manejador de fallos de p�gina determina lo que se debe hacer para resolver esta falla de p�gina. El mismo puede:
Encontrar d�nde reside la p�gina deseada en disco y la lee (este es usualmente el caso si el fallo de p�gina es por una p�gina de c�digo)
Determina que la p�gina deseada ya est� en RAM (pero no est� asignada al proceso actual) y reconfigura el MMU para que apunte a el
Apunta a una p�gina especial que solamente contiene ceros y asigna una nueva p�gina para el proceso solamente si este intenta alguna vez escribir a la p�gina especial (esto se llama una p�gina de copia en escritura y es utilizada a menudo por p�ginas que contienen datos inicializados a cero)
Obtener la p�gina deseada desde otro lugar (lo que se discute en detalle m�s adelante)
Mientras que las primeras tres acciones son relativamente sencillas, la �ltima no lo es. Por eso necesitamos cubrir algunos t�picos adicionales.
4.4.2. El conjunto de direcciones de trabajo
El grupo de p�ginas de memoria f�sica actualmente dedicadas a un proceso espec�fico se conoce como conjunto de direcciones de trabajo para ese proceso. El n�mero de p�ginas en el conjunto de direcciones de trabajo puede crecer o reducirse, dependiendo de la disponibilidad general de p�ginas del sistema.
El conjunto de direcciones de trabajo crece si un proceso tiene fallos de p�ginas. El conjunto de direcciones de trabajo se reduce a medida que existen menos y menos p�ginas libres. Para evitar que se acabe la memoria completamente, se deben eliminar las p�ginas del conjunto de direcciones de trabajo y convertirlas en p�ginas libres, disponibles para un uso posterior. El sistema operativo reduce el conjunto de direcciones de trabajo mediante:
Escribiendo las p�ginas modificadas a un �rea dedicada en un dispositivo de almacenamiento masivo (usualmente conocido como espacio de intercambio o de paginado)
Marcando las p�ginas sin modificar como libres (no hay necesidad de escribir estas p�ginas fuera del disco pues no se han cambiado)
Para determinar los conjuntos de trabajo apropiados para todos los procesos, el sistema operativo debe hacer un seguimiento de la informaci�n de uso de todas las p�ginas. De esta manera, el sistema operativo determina cuales p�ginas son usadas activamente (y deben mantenerse en memoria como residentes) y cuales no (y por lo tanto, se pueden eliminar de memoria). En la mayor�a de los casos, se utiliza un tipo de algoritmo de "menos usado recientemente" para determinar cuales p�ginas son elegibles para eliminarse de los conjuntos de trabajo de los procesos.
4.4.3. Intercambio
Mientras que el hacer intercambio de memoria (swapping, escribiendo p�ginas modificadas al espacio swap del sistema) es una parte normal de la operaci�n del sistema, es posible experimentar demasiado intercambio. La raz�n por la que estar atentos ante el excesivo intercambio es que la situaci�n siguiente puede ocurrir f�cilmente, y repetirse una y otra vez:
Las p�ginas de un proceso son intercambiadas (swapped)
El proceso se vuelve ejecutable e intenta acceder a una p�gina en el espacio de intercambio
La p�gina es colocada en memoria (lo m�s probable forzando a otras p�ginas de procesos a que sean extra�das de all�)
Un momento despu�s, la p�gina es colocada nuevamente fuera de memoria
Si esta secuencia de eventos se extiende demasiado, esto se conoce como thrashing y es un indicativo de insuficiente RAM para la carga de trabajo actual. "Trashing" es extremadamente perjudicial para el rendimiento del sistema, pues las cargas de CPU y E/S que se pueden generar en tal situaci�n r�pidamente sobrepasa la carga impuesta por el trabajo real del sistema. En casos extremos, puede que el sistema no realice ning�n trabajo �til, consumiendo todos sus recursos moviendo p�ginas dentro y fuera de memoria.