- Memoria virtual en
Linux - Paginación por
demanda - Intercambio
(swapping) - Modos de
direccionamiento físico y virtual - Control
de acceso - Tabla de
páginas en Linux - Asignación de
páginas - Liberación de
páginas - La cache
de páginas Linux - Intercambiando y
liberando páginas en Linux - Intercambio de
páginas compartidas en Linux - Intercambiando y
descartando páginas - La
cache de intercambio de Linux - Copy on
write
MEMORIA VIRTUAL EN LINUX
Los procesos de
Linux usan
bibliotecas de
código
común, como por ejemplo rutinas de manejo de ficheros. No
tendría sentido que cada proceso tenga
su propia copia de la biblioteca,
así pues Linux usa bibliotecas compartidas que varios
procesos pueden usar al mismo tiempo. El
código y los datos de estas
bibliotecas compartidas tienen que estar unidos al espacio
virtual de direccionamiento de un proceso y también al
espacio virtual de direccionamiento de los otros procesos que
comparten la biblioteca.
Un proceso no utiliza todo el código y datos
contenidos en su memoria
virtual dentro de un período de tiempo determinado. La
memoria
virtual del proceso puede que tenga código que sólo
se usa en ciertas ocasiones, como en la inicialización o
para procesar un evento particular. Puede que sólo haya
usado unas pocas rutinas de sus bibliotecas compartidas.
Sería superfluo cargar todo su código y datos en
la memoria
física
donde podría terminar sin usarse. El sistema no
funcionaría eficientemente si multiplicamos ese gasto de
memoria por el número de procesos en el sistema. Para
solventar el problema, Linux usa una técnica llamada
Páginación por Demanda
(demand paging) que sólo copia una página de
memoria virtual de un proceso en la memoria física del
sistema cuando el proceso trata de usarla. De esta manera, en vez
de cargar el código y los datos en la memoria
física de inmediato, el núcleo de Linux altera la
tabla de páginas del proceso, designando las áreas
virtuales como existentes, pero no en memoria.
Linux necesita saber de dónde viene esa memoria
virtual y cómo ponerla en memoria para arreglar los fallos
de página. Como estas áreas de memoria virtual
vienen de varias fuentes, Linux
introduce un nivel de abstracción en la interfaz haciendo
que la estructura
apunte a un grupo de
rutinas de manejo de memoria virtual. De esta manera, toda la
memoria virtual de un proceso se puede gestionar de una manera
consistente sin que importe las diferentes maneras de gestionar
esa memoria por parte de distintos servicios de
gestión.
Cuando un proceso reserva memoria virtual, en realidad
Linux no reserva memoria física para el proceso. Lo que
hace es describir la memoria virtual creando una nueva
estructura. Esta se une a la lista de memoria virtual del
proceso. Cuando el proceso intenta escribir en una dirección virtual dentro de la nueva
región de memoria virtual, el sistema creará un
fallo de página. El procesador
tratará de decodificar la dirección virtual, pero
dado que no existe ninguna entrada de tabla de páginas
para esta memoria, no lo intentará más, y
creará una excepción de fallo de página,
dejando al núcleo de Linux la tarea de reparar el fallo.
Linux mira a ver si la dirección virtual que se
trató de usar está en el espacio de
direccionamiento virtual del proceso en curso. Si así es,
Linux crea los PTEs (entrada en la tabla de páginas)
apropiados y reserva una página de memoria física
para este proceso.
Linux utiliza en un sistema Intel x86 utiliza
páginas de 4 Kbytes. Cada una de estas páginas
tiene asociado un único número; el número de
marco de página (PFN). En este modelo de
paginación, una dirección virtual está
compuesta de dos partes: un desplazamiento y un número de
página virtual. Si el tamaño de página es de
4Kbytes, los bits 11:0 de la dirección de memoria virtual
contienen el desplazamiento y los restantes bits desde el bit 12
son el número de marco de página
virtual.
PAGINACIÓN POR DEMANDA
Puesto que hay mucha menos memoria física que
memoria virtual, el sistema operativo
ha de tener especial cuidado de no hacer un mal uso de la memoria
física. Una forma de conservar memoria física es
cargar sólo las páginas que están siendo
utilizadas por un programa.
Esta técnica de cargar sólo páginas
virtuales en memoria conforme son accedidas es conocida como
Paginación por Demanda.
Linux utiliza la paginación por demanda para
cargar imágenes
ejecutables en la memoria virtual de un proceso. Siempre que se
ejecuta un proceso, se abre el fichero que la contiene y su
contenido se asocia en la memoria virtual del proceso. Esto se
hace modificando las estructuras de
datos que describen el mapa de memoria del proceso y se conoce
como asociación de memoria. Sin embargo,
sólo la primera parte de la imagen se copia
realmente en memoria física. El resto de la imagen se deja
en disco. Conforme se va ejecutando, se generan fallos de
página y Linux utiliza el mapa de memoria del proceso para
determinar qué partes de la imagen ha de traer a memoria
para ser ejecutadas.
INTERCAMBIO (SWAPPING)
Si un proceso necesita cargar una página de
memoria virtual a memoria física y no hay ninguna
página de memoria física libre, el sistema
operativo tiene que crear espacio para la nueva página
eliminando alguna otra página de memoria física. Si
la página que se va a eliminar de memoria física
provenía de una fichero imagen o de un fichero de datos
sobre el que no se ha realizado ninguna escritura,
entonces la página no necesita ser guardada. Tan
sólo se tiene que desechar y si el proceso que la estaba
utilizando la vuelve a necesitar simplemente se carga nuevamente
desde el fichero imagen o de datos.
Por otra parte, si la página había sido
modificada, el sistema operativo debe preservar su contenido para
que pueda volver a ser accedido. Este tipo de página se
conoce como página sucia (dirty page) y para
poderla eliminar de memoria se ha de guardar en un fichero
especial llamado fichero de intercambio (swap file). El tiempo de
acceso al fichero de intercambio es muy grande en relación
a la velocidad del
procesador y la memoria física, por lo que el sistema
operativo tiene que conjugar la necesidad de escribir
páginas al disco con la necesidad de retenerlas en memoria
para ser usadas posteriormente.
Linux utiliza la técnica de paginación por
antigüedad (LRU Last Redently Used) para escoger de forma
equitativa y justa las páginas a ser intercambiadas o
descartadas del sistema. Este esquema implica que cada
página del sistema ha de tener una antigüedad que ha
de actualizarse conforme la página es accedida. Cuanto
más se accede a una página más joven es; por
el contrario cuanto menos se utiliza más vieja e
inútil. Las páginas viejas son las mejoras
candidatas para ser intercambiadas (Principio de Localidad
Temporal).
Gracias a los mecanismos de memoria virtual se puede
conseguir fácilmente que varios procesos compartan
memoria. Todos los accesos a memoria se realizan a través
de las tablas de páginas y cada proceso tiene su propia
tabla de páginas.
Página siguiente |