- 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 |