La Memoria Virtual
La Memoria Virtual
La Memoria Virtual
virtual
Enric Morancho Llena
Dolors Royo Vallés
PID_00215288
© FUOC • PID_00215288 La memoria virtual
Ninguna parte de esta publicación, incluido el diseño general y la cubierta, puede ser copiada,
reproducida, almacenada o transmitida de ninguna forma, ni por ningún medio, sea éste eléctrico,
químico, mecánico, óptico, grabación, fotocopia, o cualquier otro, sin la previa autorización escrita
de los titulares del copyright.
© FUOC • PID_00215288 La memoria virtual
Índice
Introducción............................................................................................... 5
Objetivos....................................................................................................... 6
2. Soporte hardware.............................................................................. 9
2.1. Funcionalidades mínimas que debe ofrecer una MMU .............. 9
2.2. Consideraciones de eficiencia ..................................................... 11
Resumen....................................................................................................... 24
Actividades.................................................................................................. 25
Ejercicios de autoevaluación.................................................................. 26
Solucionario................................................................................................ 28
Glosario........................................................................................................ 29
Bibliografía................................................................................................. 30
Anexos........................................................................................................... 31
© FUOC • PID_00215288 5 La memoria virtual
Introducción
Objetivos
Ved también
El objetivo principal de la memoria�virtual es ofrecer a los procesos una
visión idealizada de la memoria. En el módulo "Gestión de me-
moria" de la asignatura Siste-
mas operativos se presentó el
concepto de memoria virtual.
Entre otras cosas, esta idealización permite que cada proceso disponga de, co-
mo mínimo, un espacio de direcciones (espacio lógico) para él solo, indepen-
diente de los del resto de los procesos en ejecución; además, puede permitir
a los procesos disponer de un espacio lógico de tamaño superior al de la me-
moria física instalada. Por lo tanto, la memoria virtual esconde a los procesos
varias problemáticas relacionadas con la memoria, como la compartición de
la memoria física entre varios procesos, la fragmentación externa, el hecho de
tener toda la memoria física ocupada y tener que gestionar una jerarquía de
memoria, etc. A pesar del coste hardware y software de las implementaciones
de memoria virtual, las ventajas de disponer de ella son considerables.
Algunas de las ventajas son, por ejemplo, simplificar la tarea del programador, reducir el
tiempo de carga de los programas (para empezar a ejecutar un programa, no es necesario
que esté cargado totalmente en la memoria física), permitir el aumento del grado de
multiprogramación (la suma de los tamaños de los espacios lógicos de todos los procesos
puede superar la capacidad de la memoria física con creces), permitir compartir datos y
código entre procesos, etc.
(1)
En la asignatura Sistemas operativos se vio una posible implementación de me- En inglés, swap area.
moria virtual basada en paginación. Esta implementación utiliza un hardware
especializado denominado memory management unit (MMU) que traduce diná-
micamente, es decir, en tiempo de ejecución, las direcciones lógicas generadas
por los procesos en direcciones físicas. Además, dispone de un espacio en disco
(área de intercambio1) para poder almacenar toda aquella información que,
en un momento dado, no puede ser almacenada en la memoria física.
b) Algunas de las tareas que debe llevar a cabo una implementación de memo- Implementación de
ria virtual pueden ser relativamente complejas y pueden variar de una versión memoria virtual
a otra del sistema operativo. Por lo tanto, estas tareas suelen ser implementa- Algunos ejemplos de las tareas
das por código propio del sistema operativo, es decir, están implementadas que debe llevar a cabo una im-
plementación de memoria vir-
por software. tual son decidir qué parte del
espacio lógico de un proceso
se encuentra en la memoria fí-
sica y qué parte se encuentra
En este módulo haremos un breve repaso al componente hardware de las im- en el área de intercambio, de-
plementaciones de memoria virtual y veremos con detalle el componente soft- cidir cuántas páginas puede
tener cargadas el proceso en
ware de la implementación de memoria virtual. memoria, llevar páginas desde
el área de intercambio a me-
moria física (swap-in), y al re-
vés, desde la memoria física
al área de intercambio (swap-
out), etc.
© FUOC • PID_00215288 9 La memoria virtual
2. Soporte hardware
Este apartado hace un breve repaso del soporte hardware necesario para im-
plementar memoria virtual basada en paginación. Además, se harán algunas
consideraciones que se deben tener en cuenta en una implementación de me-
moria virtual.
(2)
MMU es la sigla de memory ma-
Las funcionalidades�mínimas que debe ofrecer la MMU que imple- 2 nagement unit.
(3)
1)�Mecanismo�de�traducción. Traduce cada dirección lógica generada por un Bit�de�validez: indica si la pági-
na pertenece al espacio lógico del
proceso en la dirección física equivalente. Un sistema de gestión de memoria
proceso.
basado en paginación divide el espacio lógico y el espacio físico en porciones Bit�de�presencia: indica si una pá-
gina válida está cargada en memo-
de tamaño fijo llamadas páginas. La MMU descompone las direcciones lógicas ria física.
en dos componentes (identificador de página y desplazamiento dentro de la
(4)
página). Para hacer la traducción, consulta una tabla de páginas donde cada En inglés, read only.
entrada contiene el identificador de frame (página física) donde se almacena
(5)
la página lógica, así como una serie de bits de control –como mínimo, validez En inglés, dirty bit.
3 4
y presencia , pero puede tener otros como "solo lectura ", ejecución, modifi-
cado5, accedido, etc.
Tabla de páginas
(6)
2)�Generación�de�excepciones. En el caso de que el mecanismo de traducción En inglés, page fault.
no pueda realizar la traducción, la MMU generará una excepción. La MMU
puede generar varios tipos de excepciones, pero las más habituales son: direc-
ción lógica inválida (generada cuando el proceso intenta acceder a una página
inválida) y fallo de página6 (generado cuando el proceso intenta acceder a una
página válida pero que no está presente en memoria física porque se encuentra
en el área de intercambio).
Las rutinas de tratamiento para estas excepciones son rutinas propias del sis-
tema operativo. Cuando se produzca una excepción, el sistema operativo to-
mará el control de la situación e intentará poner remedio al problema: si no
es posible solucionarlo, el sistema operativo abortará el proceso; si es posible
solucionarlo, el sistema operativo hará retomar la ejecución del proceso desde
el acceso a memoria que ha provocado la excepción.
© FUOC • PID_00215288 10 La memoria virtual
Si un proceso intenta acceder a una página válida pero que no está presente en memoria
física, la rutina de atención a la excepción de fallo de página leerá en el área de intercam-
bio la página solicitada y la copiará en memoria física (posiblemente, también habrá que
copiar la página de memoria física que se está sobrescribiendo en el área de intercambio),
actualizará las estructuras de datos del sistema operativo relativas a memoria virtual y
hará que el proceso continúe la ejecución desde el acceso a memoria que ha provocado
la excepción.
Figura 1. Implementación de una MMU basada en paginación que soporte memoria virtual
© FUOC • PID_00215288 11 La memoria virtual
1)�Estructura�de�la�tabla�de�páginas
2)�TLB�(translation�lookaside�buffer).
(7)
Conceptualmente, la traducción de direcciones basada en paginación requiere TLB es la sigla de translation loo-
kaside buffer.
realizar dos accesos a la memoria física por cada referencia a la memoria lógi-
ca: el primero para acceder a la entrada correspondiente de la tabla de páginas (8)
En inglés, TLB miss.
y el segundo para acceder realmente al dato. Como este sobrecoste no es to-
lerable, los sistemas de traducción basados en paginación suelen disponer de
Ved también
una memoria caché que contiene las últimas entradas utilizadas de la tabla de
páginas. Esta memoria recibe el nombre de TLB7. Antes de acceder a la tabla La localidad temporal y espa-
cial se tratan en el anexo 1.
de páginas, la MMU accede al TLB: si la traducción se encuentra en el TLB, no "Localidad temporal y locali-
dad espacial de un proceso".
habrá que acceder a la tabla de páginas, de lo contrario, se produce un fallo
de TLB8 y habrá que acceder a la tabla de páginas (como si no hubiera TLB).
Los TLB son muy eficaces y ahorran una parte muy importante de los accesos
a la tabla de páginas porque los accesos a memoria de los procesos exhiben
localidad temporal y espacial, por lo que es habitual que un proceso acceda
repetidas veces a una misma página.
© FUOC • PID_00215288 12 La memoria virtual
(9)
La gestión de los TLB misses depende de la arquitectura. Por ejemplo, en el En inglés, page walk.
caso de IA-32, los TLB misses son gestionados directamente por el hardware;
es responsabilidad del hardware buscar la traducción en la tabla de páginas9
y actualizar el contenido del TLB. En cambio, otras arquitecturas generan una
excepción y es el sistema operativo el que se encarga de acceder a la tabla de
páginas y de actualizar el contenido del TLB.
En caso de cambio de contexto, en algunas arquitecturas hay que invalidar Procesador Intel Core i7
el contenido del TLB porque las traducciones almacenadas en el TLB son vá-
Como referencia, el procesa-
lidas únicamente para el proceso que estaba en ejecución. Otras arquitectu- dor Intel Core i7 dispone de
ras permiten identificar las traducciones correspondientes a accesos propios un TLB organizado en dos ni-
veles. El primer nivel contiene
del sistema operativo; estas traducciones no se invalidan en caso de cambio 64 traducciones y el segundo
nivel, 512. Tanto el primer co-
de contexto. Finalmente, otras arquitecturas permiten asociar una especie de mo el segundo nivel son me-
morias caché con asociativi-
identificador de proceso a las entradas del TLB; en este caso, no es necesario dad 4. Cuando hay que reali-
invalidar el contenido del TLB cuando se produce un cambio de contexto. zar una traducción, se consul-
ta el primer nivel de TLB; si no
se encuentra la traducción, se
consulta el segundo nivel de
TLB; si tampoco se encuentra
(TLB miss), hay que acceder a
la tabla de páginas almacena-
da en memoria.
© FUOC • PID_00215288 13 La memoria virtual
gidas a la hora de cargar una nueva página en la memoria. Por lo tanto, la Una única excepción a esta
política de emplazamiento no afectará a la eficiencia del gestor de la memoria política de gestión de memo-
ria basada en paginación se-
virtual paginada. rían las páginas utilizadas por
dispositivos de entrada/salida
que trabajan directamente con
direcciones físicas de memo-
En un sistema con paginación pura (bajo demanda), solo se carga una página ria. No obstante, estas páginas
en la memoria principal cuando se produce un fallo de página con una direc- suelen estar asignadas al siste-
ma operativo, con lo que nun-
ción que hace referencia a la página en cuestión. Otra alternativa es que, apro- ca estarán disponibles para los
procesos.
vechando la localidad espacial de los accesos a memoria, además de cargar la
© FUOC • PID_00215288 14 La memoria virtual
(10)
página que ha provocado el fallo también se carguen un cierto número adi- En inglés, prefetching.
cional de páginas lógicamente contiguas a la que ha provocado el fallo. Esta
alternativa recibe el nombre de prebúsqueda10. Ved también
Fallos de página
Se han propuesto varias políticas de reemplazo y, muy probablemente,
cada sistema operativo implementa una política diferente. En cualquier Cada vez que se produce un
fallo de página se genera una
caso, una política�de�reemplazo debe tener como objetivo que el por- excepción que debe ser trata-
da por el sistema operativo,
centaje de fallos de página (tasa de fallos de página) con respecto al to- con el consiguiente cambio de
tal de referencias efectuadas en la memoria física sea lo más pequeño modo de ejecución y transfe-
rencia de control a una ruti-
posible. na propia del sistema opera-
tivo. Como estas acciones tie-
nen un coste computacional
apreciable, una tasa excesiva-
mente elevada de fallos de pá-
En algunos sistemas operativos (como Linux), la política de reemplazo elige gina puede impactar de mane-
únicamente páginas asignadas a procesos; en ningún caso elegirá una página ra apreciable en el rendimiento
de la máquina.
asignada al núcleo del sistema operativo. Esto se debe a que algunas porciones
de código/datos/pila del sistema operativo en ningún caso pueden ser inter-
cambiadas en el área de intercambio (por ejemplo, las páginas que contienen
el código de atención a la excepción del fallo de página). Además, por una
cuestión de eficiencia, es recomendable que todo el núcleo del sistema opera-
tivo esté presente en memoria física. En este módulo asumiremos que única-
mente podrán ser reemplazadas páginas asignadas a procesos.
1)� Política� de� reemplazo� global. Si las políticas son globales, se considera
que todas las páginas de la memoria física son candidatas a ser reemplazadas.
Un reemplazo puede sacar de la memoria una página asignada a un proceso
diferente del proceso que ha generado el fallo de página. Con las políticas
de reemplazo global, un proceso puede tener un número variable de páginas
cargadas en la memoria: desde cero hasta todas las páginas a las que haya
hecho referencia hasta un cierto instante. Entonces, el número de fallos de
página de un proceso depende de la carga del sistema y, muy probablemente,
el tiempo de ejecución del proceso será variable entre ejecuciones diferentes.
(11)
El algoritmo FIFO11 es fácil de implementar (solo se necesita una memoria FIFO es la sigla de first in, first
out.
12
intermedia circular y un puntero), pero tiene algunas carencias, como las
siguientes: (12)
En inglés, buffer.
La anomalía de Belady
Veamos un ejemplo concreto para ilustrar el hecho de que un aumento del número de
páginas cargadas en la memoria no implica una disminución del número de fallos de
página.
(13)
En la figura 4 mostramos el resultado de aplicar el algoritmo de reemplazo LRU es la sigla de least recently
13 used.
LRU a la secuencia de referencias en la memoria que hemos propuesto como
ejemplo:
para encontrar la página que tiene el contador más bajo. Tenemos el proble-
ma de que el contador se puede saturar, es decir, se puede producir lo que se
denomina un desbordamiento.
b) Utilizando una pila. La idea es mantener una estructura de tipo pila con el
número de páginas que se referencian. Siempre que se hace una referencia a
una página, esta pasa a la cima de la pila, de manera que las páginas que hace
menos tiempo que han sido referenciadas se encuentran cerca de la cima de
la pila, y las páginas que hace más tiempo que han sido referenciadas están
cerca de la base de la pila. Para implementar este esquema, se necesita una lista
doblemente encadenada. Efectuar una actualización tiene un coste mayor que
utilizar los contadores porque se deben actualizar muchos punteros, pero así
evitamos hacer una búsqueda de todas las páginas.
Aproximaciones�al�algoritmo�LRU
1)� Guardar� la� historia� de� las� referencias. En este caso, además del bit de
referencia, para cada página se añade un registro de k bits que guarda la historia
de las referencias a la página (de los últimos k intervalos de tiempo) e indica
si se ha hecho referencia a la página al menos una vez cada intervalo. Este
registro histórico se actualiza a intervalos regulares, con lo que se descarta la
posición menos significativa y se incorpora a la posición más significativa el
bit de referencia, que se pone a cero cada vez que se actualiza el registro de
historia de la página (los k bits).
La página que tiene el registro de historia con el valor más pequeño es la can-
didata a salir de la memoria. Si hay más de una página con el mismo valor
del registro histórico, se puede aplicar cualquier algoritmo de selección (por
ejemplo, el FIFO) que indique cuál es la página candidata a salir de la memo-
ria, o se pueden sacar todas las posibles candidatas.
3)�Algoritmo�del�reloj. Es una sofisticación del algoritmo de segunda opor- Algoritmo del reloj
tunidad. Utiliza una memoria intermedia circular de páginas y mantiene un
Linux utiliza una variante de
puntero en la última posición examinada. La diferencia respecto al algoritmo este algoritmo como algoritmo
de segunda oportunidad es que no mueve dentro de la estructura las páginas a de reemplazo.
las que se da una segunda oportunidad. Si decide que hay que dar una segunda
oportunidad a una página, lo único que hay que hacer es mover el puntero a
la siguiente posición de la memoria intermedia circular.
1)�El�número�máximo�de�páginas�de�la�memoria�física�que�se�pueden�asig-
nar�a�un�proceso. Este número está determinado por el tamaño de la memoria
física del sistema. Si permitimos a un único proceso ocupar toda la memoria
del sistema, limitamos el grado de multiprogramación.
2)�El�número�mínimo�de�páginas�de�la�memoria�física�que�debemos�asig-
nar� a� un� proceso. Este número está determinado por la arquitectura del
computador en el que se ejecuta el proceso. Hay que recordar que para poder
ejecutar una instrucción, todas las páginas del espacio lógico al que se hace
referencia durante la ejecución deben estar cargadas en la memoria.
En cambio, si las referencias a los operandos pueden ser direcciones indirec- Computadores PDP-8 o
tas, es decir, si en la instrucción se especifica una dirección de la memoria PDP-11
que contiene la dirección del operando buscado, entonces para asegurar que En los computadores PDP-8 o
todo proceso podrá ejecutarse correctamente en el sistema se le deben asignar los PDP-11, que disponían de
una arquitectura de lenguaje
al menos tres páginas de la memoria: una que contenga la instrucción, otra máquina muy compleja (de ti-
po CISC), el número mínimo
con la dirección del operando y una tercera página que incluya el operando. de páginas que se debía asig-
nar a un proceso para asegurar
En las arquitecturas actuales, de tipo RISC, en las que el lenguaje máquina es una ejecución correcta podía
muy sencillo, las necesidades mínimas suelen ser de dos páginas, una para la ser considerable, por ejemplo,
hasta seis en el PDP-11.
instrucción y otra para el operando.
También hay políticas adaptativas que intentan identificar las fases de ejecu-
ción existentes en la mayoría de los programas (inicialización, período perma-
nente, etc.) y asignar el número de páginas adecuado para cada fase.
Hiperpaginación (trashing)
(14)
El modelo del conjunto de trabajo14 se intenta adaptar a la localidad de los En inglés, working set.
determina el tamaño de la ventana (T), y el número de páginas diferentes que Recordad que la localidad es-
se referencian dentro de la ventana de trabajo es lo que forma el conjunto de pacial se trata en el anexo 1,
"Localidad temporal y locali-
dad espacial de un proceso".
© FUOC • PID_00215288 23 La memoria virtual
trabajo. Si una página se está utilizando, estará dentro del conjunto de trabajo,
y si no se utiliza, saldrá del conjunto de trabajo T referencias después de ser
referenciada por última vez.
Con esta estrategia se consigue un buen uso de la CPU, se evita que el sistema
entre en situación de hiperpaginación y, además, se consigue alcanzar un gra-
do de multiprogramación del sistema razonablemente alto.
Resumen
Actividades
1. Una máquina ofrece a los usuarios un espacio de direcciones virtual de 224 palabras. La
máquina tiene 218 palabras de la memoria física. La memoria virtual se implementa por pa-
ginación y el tamaño de la página es de 256 palabras. Una operación de usuario genera la
dirección virtual 111234A6 (en hexadecimal). Explicad cómo establece el sistema la posición
física correspondiente a esta dirección.
3. Buscad información sobre el formato de las entradas de las tablas de páginas (PDE y PTE)
en la arquitectura IA32. ¿Cuál es la diferencia entre una PDE y la PTE? ¿Cuál es la función
de cada uno de los bits de control existentes?
4. Comparad el formato de las entradas de las tablas de páginas de los procesadores Intel de
64 bits con el formato de los procesadores Intel de 32 bits.
5. Cuando hay un cambio de contexto, ¿qué sucede con la información que tenemos en
la TLB? Recordad que el término cambio de contexto hace referencia a las acciones que lleva
a cabo el sistema cuando deja de ejecutar un proceso y pasa a ejecutar otro que estaba en
espera para ser ejecutado.
6. ¿En la TLB podemos tener información de un proceso o de varios procesos a la vez? ¿Qué
campos debería tener una entrada de la TLB para poder soportar varios procesos simultánea-
mente?
7. Decid si las estructuras y las técnicas de programación siguientes son útiles en un entorno
en programación con prebúsqueda. Recordad que debéis tener en cuenta que cuando se pro-
duce un fallo de la página k, el algoritmo de prebúsqueda carga en la memoria la página k
y la k + 1.
a) La pila.
b) La búsqueda secuencial.
c) La búsqueda dicotómica.
d) El código de un programa.
e) Operaciones con vectores.
f) El direccionamiento indirecto.
9. Suponed que en un sistema con gestión de la memoria virtual paginada aplicamos una
política de reemplazo que consiste en examinar cada página regularmente y descargarla de la
memoria física si no se ha utilizado desde la última consulta. ¿Qué ganaríamos o perderíamos
utilizando esta política en lugar de aplicar la política de reemplazo LRU o la de la segunda
oportunidad?
10. Imaginad que queremos utilizar un algoritmo que necesita un bit de referencia (como
el algoritmo de la segunda oportunidad o el que tiene en cuenta el conjunto de páginas de
trabajo), pero el hardware del sistema no lo proporciona. ¿Podríais proponer alguna manera
de simular el bit de referencia? En caso de que fuera posible, ¿sería muy costoso?
11. ¿Qué problemas pueden surgir si se sacan de la memoria páginas que intervienen en una
operación de entrada/salida por DMA? ¿Cómo se podrían solucionar?
12. ¿Podemos tener algún problema si un algoritmo de reemplazo saca páginas de la memoria
que contengan datos y/o código del núcleo del sistema operativo? ¿Por qué?
2048 del espacio lógico y que el sistema de gestión de memoria es paginado con un tamaño
de página igual a 1 KB.
En la página 0 (que solo contiene código) tenemos un pequeño programa que inicializa la
matriz a 0. El código del bucle principal es:
int A[256][256];
for (i=0; i<256; i++) {
for (k=0; k<256; k++) {
A[k][i] = 0;
}
}
a) Suponiendo que tenemos una limitación de tres páginas físicas, ¿cuántos fallos de página
se producirán si se aplica el algoritmo de reemplazo LRU? (no tengáis en cuenta el acceso al
código del programa y tened en cuenta únicamente el acceso a los datos de la matriz).
b) ¿Cuántos fallos de página se producirán si cambiamos el orden de los bucles?
c) Haced el mismo análisis de los apartados anteriores a partir de un sistema con páginas de
2 KB. Suponed que la matriz está cargada en la memoria por filas.
14. La llamada al sistema fork() de Unix crea un proceso nuevo que es una copia casi idéntica
del proceso que la ha invocado. Para reducir el coste computacional de esta llamada, la im-
plementación de esta llamada utiliza una técnica denominada copy on write (COW). Buscad
información para saber en qué consiste y cómo está implementada.
Ejercicios de autoevaluación
1. Disponemos de un sistema de gestión de memoria basado en paginación con las caracte-
rísticas siguientes:
• Páginas de 4 KBytes.
• Espacio lógico de 64 KBytes.
• Espacio físico de 32 KBytes.
• Número de páginas físicas que puede llegar a ocupar un proceso: 4.
Dada la siguiente secuencia de accesos a octeto (las direcciones están codificadas en hexa-
decimal) realizadas por un proceso: 6b45, 2244, 3540, 6340, 4200, 5001, 2200, 6000, 2000,
4300, 5034, 6002, 2008:
b) Indicad cuál es el contenido de la tabla de páginas del proceso una vez finalizada la quinta
referencia a memoria utilizando el primero de los algoritmos.
En la página 0 (que únicamente contiene código) tenemos un pequeño programa que inicia-
liza la matriz a 0. Si el código del bucle principal es:
int A[256][256];
for (i=0; i<256; i++) {
for (k=0; k<256; k++) {
A[k][i] = 0;
}
}
© FUOC • PID_00215288 27 La memoria virtual
a) ¿Cuántos fallos de página se producirán si suponemos que el proceso puede tener tres
páginas de la memoria física, una de las cuales siempre tiene la página que contiene el código
y las otras dos son para los datos?
b) ¿Y si cambiamos el orden de ejecución de los bucles?
c) ¿Qué pasaría si se ejecutara el mismo código, pero escrito en lenguaje de alto nivel Fortran?
© FUOC • PID_00215288 28 La memoria virtual
Solucionario
Ejercicios de autoevaluación
1. Como las páginas son de 4 KB y las direcciones lógicas son de 16 bits, los 4 bits altos de
las direcciones lógicas (es decir, el primer dígito hexadecimal) indican el número de página
lógica a la que estamos accediendo.
• LRU
Al acabar la quinta referencia, la tabla de páginas tendrá (se ha asumido que únicamente las
páginas referenciadas por el proceso son válidas y que los frames físicos se asignan empezando
por el 0):
• FIFO
Si miramos el patrón de acceso a la matriz del código que se ejecuta, vemos que se está
accediendo a la matriz por columnas. El primer acceso, A[0][0], provoca un fallo de página
y carga la página 2 en la memoria física. El segundo acceso, A[1][0], provoca otro fallo de
página, dado que este elemento se mapea en la página 3 del espacio lógico del proceso. El
tercer acceso, A[2][0], también provoca un fallo de página, y así en todos los accesos de la
primera columna. Obtendremos un total de 256 fallos de página.
Cuando se accede a la segunda columna vuelve a suceder a lo mismo, ya que tenemos car-
gadas en la memoria las páginas 257 y 258, y el primer elemento de la segunda columna
está en la página 2.
b) Si cambiamos el orden de los bucles, la cosa va mejor. El acceso a la matriz se hace por filas
y, por lo tanto, aprovechamos la localidad espacial de la matriz. El proceso funcionará de la
manera siguiente: el primer acceso al elemento A[0][0] provoca un fallo de página y se carga
la página 2 en la memoria principal. Los 255 accesos siguientes no originarán ningún fallo de
página porque todos los elementos de la primera fila de la matriz se mapean en la página 2.
Por lo tanto, con el nuevo código pasamos a tener 256 fallos de página, un número mucho
más razonable que en el caso anterior. Si se hubiera aplicado la prebúsqueda, aún habríamos
podido reducir más el número de fallos de página.
c) En el supuesto de que el código se hubiera escrito en Fortran, los resultados habrían sido a la
inversa. El lenguaje de alto nivel Fortran introduce las matrices en la memoria por columnas.
El acceso a las matrices por columnas (como en el apartado a) es más eficiente que el acceso
por filas.
© FUOC • PID_00215288 29 La memoria virtual
Glosario
bit de presencia m Bit asociado a cada entrada de la tabla de páginas de un proceso que
indica si una página está presente en la memoria física o no. Si el bit es 0, la página no está;
si el bit es 1, la página está.
bit de referencia m Bit asociado a cada entrada de la tabla de páginas de un proceso que
indica si la página ha sido referenciada.
bit de validez m Bit asociado a cada entrada de la tabla de páginas de un proceso que
indica si la página pertenece al espacio lógico del proceso.
fallo de página m Situación que se produce cuando se accede a una dirección del espa-
cio lógico del proceso que no está cargada en la memoria. Después del fallo se genera una
excepción, y la rutina asociada a esta excepción se ocupa de cargar en la memoria la página
que ha provocado el fallo.
ventana f Valor (T) del intervalo de referencias consecutivas que define el conjunto de
trabajo.
prebúsqueda f Mecanismo que intenta sacar provecho de la localidad espacial de las pági-
nas de los procesos cargando en la memoria, además de la página que ha provocado un fallo
de página, las k páginas siguientes con el fin de evitar fallos de página posteriores durante
la ejecución del proceso.
Bibliografía
Bibliografía básica
Silberschatz, A.; Galvin, P.; Gagne. G. (2008). Operating Systems Concepts (8.ª edición).
John Wiley & Sons.
Bibliografía complementaria
Bovet, D.; Cesati, M. (2006). Understanding the Linux Kernel (3.ª edición). O'Reilly.
Gorman, M. (2004). Understanding the Linux Virtual Memory Manager. Prentice Hall.
© FUOC • PID_00215288 31 La memoria virtual
Anexos
Anexo�1.�Localidad�temporal�y�localidad�espacial�de�un�proceso
Este proceso tiene definido un vector de 1.024 enteros. Un entero ocupa 4 octetos (32
bits) de la memoria y, por lo tanto, el espacio que ocupa el vector en la memoria es de
4.096 octetos. El proceso inicializa el contenido del vector, y por eso ejecuta el bucle for
(i = 0; i < MAX; i++) con MAX igual a 1.024. Consideremos que el proceso se ejecuta
en un sistema dotado de memoria virtual paginado y que el tamaño de cada página de
la memoria física es igual a 1 KB. Supongamos que el espacio de direcciones virtual del
proceso es el que se indica en la figura 5.
© FUOC • PID_00215288 32 La memoria virtual
Si nos fijamos en los datos, vemos que cuando se accede al primer elemento del vector,
v[0], este genera la dirección lógica 1.024, que corresponde a la página 1. Las 255 refe-
rencias siguientes a los elementos v[1], v[2]..., v[255] corresponden a las direcciones ló-
gicas 1028, 1032, 1036..., todas mapeadas en la página 1. Los 256 elementos siguientes
del vector, del v[256] al v[511], generan accesos a la página 2 del espacio de direcciones
virtual del proceso. El acceso a los elementos siguientes del vector, del v[512] al v[767],
genera el acceso a la página 3 del espacio de direcciones virtual y, finalmente, las últimas
256 referencias acceden a la página 4.
1,1,1, ... 1,1,1, 2,2,2, ... 2,2,2, 3,3,3, ... 3,3,3,4,4,4, ... 4,4,4
Al analizar qué tipo de localidad aparece en este caso, vemos que, por una parte, hay
localidad temporal mientras se accede a los elementos de una misma página, y, por otra,
encontramos localidad espacial, ya que los elementos del vector ocupan páginas conti-
guas en el espacio de direcciones virtual, y estas páginas son referenciadas secuencial-
mente. Por lo tanto, se cumple la tendencia de que cuando referenciamos una página
existe una probabilidad muy alta de que al cabo de un tiempo relativamente no muy
grande se referencie la página siguiente.
Podemos sacar provecho de este comportamiento del proceso para evitar sacar páginas
que son muy referenciadas. Por ejemplo, si se hace referencia continuamente a la página
0, sería muy poco eficiente llevarla al disco mientras se ejecuta el proceso, ya que se
producen muchos fallos de página y habría un incremento del tiempo total de ejecución
del proceso. Así pues, la localidad temporal de los procesos nos puede ayudar a definir
políticas para decidir qué página es candidata a salir de la memoria.
Cómo�aprovechar�localidad�espacial
Hemos visto que en un sistema con paginación pura solo llevamos páginas
a la memoria principal si se produce un fallo de página. Si suponemos que
los procesos tienen localidad espacial, podemos adelantar trabajo y, cuando
se produce un fallo de página, además de cargar en la memoria la página en
© FUOC • PID_00215288 33 La memoria virtual
Anexo�2.�Asignación�de�memoria�en�el�núcleo�de�Linux
A lo largo del ciclo de vida de los procesos de usuario, estos solicitan memoria
tanto en el momento de la creación (para ubicar el código, los datos y la pila
del nuevo proceso) como en tiempo de ejecución (si el proceso pide memoria
dinámica, si hay que hacer crecer la pila, si se carga un nuevo ejecutable uti-
lizando alguno de los llamamientos exec). El núcleo utiliza la granularidad de
página para asignar/desasignar memoria a los procesos de usuario.
Ahora bien, el propio núcleo del sistema operativo también tiene necesidades
de memoria dinámica: memorias intermedias, estructuras de datos, etc. Hay
que notar que las peticiones de memoria realizadas por el núcleo del SO tienen
unas particularidades respecto a las peticiones de los procesos de usuario:
Todo esto hace que el núcleo del sistema operativo utilice un gestor de me-
moria específico para satisfacer sus necesidades de memoria dinámica. A con-
tinuación, veremos los gestores de memoria utilizados por el núcleo de Linux
para satisfacer las peticiones de memoria del propio núcleo.
1)�Espacio�de�direcciones�lógico�del�núcleo�de�Linux�en�IA-32
Dentro del rango de direcciones lógico del núcleo de Linux, encontramos estas
partes:
2)�Asignación�de�memoria�al�núcleo
© FUOC • PID_00215288 35 La memoria virtual
a)�Asignación�de�páginas�físicamente�contiguas:�Buddy�system
Este gestor permite obtener páginas físicamente contiguas. Ahora bien, está
diseñado para intentar minimizar el impacto de la fragmentación externa que
puede provocar la contigüidad. El buddy system se fundamenta en dos carac-
terísticas:
b)�Asignación�de�memoria�físicamente�contigua�(tamaño�arbitrario)
SLAB�allocator
Este gestor está disponible en el núcleo de Linux desde la versión 2.2. Sus
características principales son:
• Una slab-cache está formada por una o más losas. Todas las slabs de una
slab-cache son del mismo tamaño.
• Existe una slab-cache para cada objeto o estructura de datos que el núcleo
necesite crear dinámicamente (por ejemplo, el task_struct de los procesos
© FUOC • PID_00215288 38 La memoria virtual
o los inodes de los ficheros). Cada slab-cache puede tener su propio tamaño
de slab.
Figura 7. Ejemplo donde se muestran dos slab-cache, una con dos losas (de 3 páginas) y la otra con una losa (de 2
páginas)
Cada losa de una slab-cache tiene uno de estos tres estados: empty (todos sus
objetos están marcados como libres), partial (algunos objetos están marcados
como libres y otros, como utilizados) y full (todos los objetos están marcados
como utilizados). Inicialmente, la losa está empty.
Las ventajas de este gestor son que minimiza la fragmentación interna y que
es muy rápido asignando/desasignando objetos al núcleo (notad que la me-
moria ha sido preasignada al gestor al crear cada slab-cache). El inconveniente
principal es la falta de escalabilidad en sistemas en muchos procesadores.
SLUB�allocator
SLOB�allocator
c)�Asignación�no�contigua
Las asignaciones deben tener tamaño múltiple del tamaño de página. Además,
el gestor separa las asignaciones consecutivas mediante una página marcada
como inválida. Esto permite detectar desbordamientos dentro de cada asigna-
ción de memoria de este tipo.