You are on page 1of 7

Memoria virtual de Linux

MEMORIA VIRTUAL EN LINUX


Los procesos de Linux usan bibliotecas de cdigo comn, como por ejemplo rutinas de manejo de ficheros. No tendra 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 cdigo y los datos de estas bibliotecas compartidas tienen que estar unidos al espacio virtual de direccionamiento de un proceso y tambin al espacio virtual de direccionamiento de los otros procesos que comparten la biblioteca. Un proceso no utiliza todo el cdigo y datos contenidos en su memoria virtual dentro de un perodo de tiempo determinado. La memoria virtual del proceso puede que tenga cdigo que slo se usa en ciertas ocasiones, como en la inicializacin o para procesar un evento particular. Puede que slo haya usado unas pocas rutinas de sus bibliotecas compartidas. Sera superfluo cargar todo su cdigo y datos en la memoria fsica donde podra terminar sin usarse. El sistema no funcionara eficientemente si multiplicamos ese gasto de memoria por el nmero de procesos en el sistema. Para solventar el problema, Linux usa una tcnica llamada Pginacin por Demanda (demand paging) que slo copia una pgina de memoria virtual de un proceso en la memoria fsica del sistema cuando el proceso trata de usarla. De esta manera, en vez de cargar el cdigo y los datos en la memoria fsica de inmediato, el ncleo de Linux altera la tabla de pginas del proceso, designando las reas virtuales como existentes, pero no en memoria. Linux necesita saber de dnde viene esa memoria virtual y cmo ponerla en memoria para arreglar los fallos de pgina. Como estas reas de memoria virtual vienen de varias fuentes, Linux introduce un nivel de abstraccin 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 gestin. Cuando un proceso reserva memoria virtual, en realidad Linux no reserva memoria fsica 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 direccin virtual dentro de la nueva regin de memoria virtual, el sistema crear un fallo de pgina. El procesador tratar de decodificar la direccin virtual, pero dado que no existe ninguna entrada de tabla de pginas para esta memoria, no lo intentar ms, y crear una excepcin de fallo de pgina, dejando al ncleo de Linux la tarea de reparar el fallo. Linux mira a ver si la direccin 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 pginas) apropiados y reserva una pgina de memoria fsica para este proceso. Linux utiliza en un sistema Intel x86 utiliza pginas de 4 Kbytes. Cada una de estas pginas tiene asociado un nico nmero; el nmero de marco de pgina (PFN). En este modelo de paginacin, una direccin virtual est compuesta de dos partes: un desplazamiento y un nmero de pgina virtual. Si el tamao de pgina es de 4Kbytes, los bits 11:0 de la direccin de memoria virtual contienen el desplazamiento y los restantes bits desde el bit 12 son el nmero de marco de pgina virtual.

PAGINACIN POR DEMANDA

Puesto que hay mucha menos memoria fsica que memoria virtual, el sistema operativo ha de tener especial cuidado de no hacer un mal uso de la memoria fsica. Una forma de conservar memoria fsica es cargar slo las pginas que estn siendo utilizadas por un programa. Esta tcnica de cargar slo pginas virtuales en memoria conforme son accedidas es conocida como Paginacin por Demanda. Linux utiliza la paginacin por demanda para cargar imgenes 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 asociacin de memoria. Sin embargo, slo la primera parte de la imagen se copia realmente en memoria fsica. El resto de la imagen se deja en disco. Conforme se va ejecutando, se generan fallos de pgina 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 pgina de memoria virtual a memoria fsica y no hay ninguna pgina de memoria fsica libre, el sistema operativo tiene que crear espacio para la nueva pgina eliminando alguna otra pgina de memoria fsica. Si la pgina que se va a eliminar de memoria fsica provena de una fichero imagen o de un fichero de datos sobre el que no se ha realizado ninguna escritura, entonces la pgina no necesita ser guardada. Tan slo 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 pgina haba sido modificada, el sistema operativo debe preservar su contenido para que pueda volver a ser accedido. Este tipo de pgina se conoce como pgina 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 relacin a la velocidad del procesador y la memoria fsica, por lo que el sistema operativo tiene que conjugar la necesidad de escribir pginas al disco con la necesidad de retenerlas en memoria para ser usadas posteriormente. Linux utiliza la tcnica de paginacin por antigedad (LRU Last Redently Used) para escoger de forma equitativa y justa las pginas a ser intercambiadas o descartadas del sistema. Este esquema implica que cada pgina del sistema ha de tener una antigedad que ha de actualizarse conforme la pgina es accedida. Cuanto ms se accede a una pgina ms joven es; por el contrario cuanto menos se utiliza ms vieja e intil. Las pginas viejas son las mejoras candidatas para ser intercambiadas (Principio de Localidad Temporal). Gracias a los mecanismos de memoria virtual se puede conseguir fcilmente que varios procesos compartan memoria. Todos los accesos a memoria se realizan a travs de las tablas de pginas y cada proceso tiene su propia tabla de pginas.

MODOS DE DIRECCIONAMIENTO FISICO Y VIRTUAL


No tiene mucho sentido que el propio sistema operativo se ejecute sobre memoria virtual. Sera una verdadera pesadilla que el sistema operativo tuviera que mantener tablas de pginas para l mismo. La mayora de los procesadores de propsito general ofrecen la posibilidad del modo de direccionamiento fsico junto con direccionamiento virtual. El modo de direccionamiento fsico no necesita las tablas de pginas y el procesador no intenta realizar ningn tipo de

traduccines en este modo. El ncleo de Linux est preparado para funcionar sobre un espacio de direccionamiento fsico.

CONTROL DE ACCESO
Las entradas de la tabla de pginas tambin contienen informacin relativa al control de acceso. Puesto que el procesador tiene que utilizar la informacin de la tabla de pginas para traducir las direcciones virtuales a direcciones fsicas, puede fcilmente utilizar la informacin de control de acceso para comprobar que el proceso no est accediendo a memoria de forma apropiada. Hay muchas razones por las que se puede querer restringir el acceso a determinadas reas de memoria. Hay memoria, como la que contiene el ejecutable, que es claramente memoria de slo lectura; el sistema operativo no ha de dejar que el proceso escriba sobre su propio cdigo de programa. Por el contrario, pginas de memoria que contengan datos han de poder ser ledas y escritas, pero un intento de ejecutar algo de estas pginas ha de fallar. La mayora de los procesadores tienen al menos dos modos de operacin: modo ncleo y modo usuario. No es deseable que un proceso ejecute cdigo del ncleo, o que acceda a datos del ncleo excepto cuando el procesador est funcionando en modo ncleo.

CACHES
Adems de invertir esfuerzos en disear y frabricar procesadores, memoria y otros dispositivos ms rpidos, mejor forma de obtener un buen rendimiento consiste en mantener en memoria caches de la informacin que se utiliza muy a menudo. Linux emplea unas cuantas caches para la gestin de la memoria, entre las cuales tenemos: Buffer Cach Contiene buffers de datos que son utilizados por los manejadores de dispositivos de bloques. Estos buffers son de tamao fijo (por ejemplo 512 bytes) y contienen bloques de informacin que ha sido bien leda de un dispositivo de bloques o que ha de ser escrita. Un dispositivo de bloques es un dispositivo sobre el que slo se pueden realizar operaciones de lectura o escritura de bloques de tamao fijo. Por ejemplo, los discos duros son dispositivos de bloque. El cache buffer est indexado va el identificador de dispositivo y el nmero de bloque deseado, ndice que es utilizado para una rpida localizacin del bloque. Los dispositivos de bloque son exclusivamente accedidos a travs del buffer Cache. Cach de Pginas Este se utiliza para acelerar el acceso a imgenes y datos en disco. Se utiliza para guardar el contenido lgico de un fichero de pgina en pgina y se accede va el fichero y el desplazamiento dentro del fichero. Conforme las pginas se leen en memoria, se almacenan en la page cach.. Cache de Intercambio Solo las pginas que han sido modificadas (dirty) son guardadas en el fichero de intercambio. Mientras no vuelvan a ser modificadas despus de haber sido guardadas en el fichero de swap, la prxima vez que necesiten ser descartadas (swap out) no ser necesario copiarlas al fichero de intercambio pues ya estn all. Caches Hardware

Es una cach normalmente implementada en el propio procesador; la cache de entradas de tabla de pgina. En este caso, el procesador no necesita siempre leer la tabla de pginas directamente, sino que guarda en esta cache las traducciones de las pginas conforme las va necesitando. El inconveniente de utilizar memorias cache, tanto hardware como de otro tipo, es que para evitar esfuerzos Linux tiene que utilizar ms tiempo y espacio para mantenerlas y, si se corrompe su contenido, el sistema dejar de funcionar.

TABLA DE PGINAS EN LINUX


Linux supone que hay tres niveles de tablas de pginas:

El directorio de tablas de pginas (punteros a tablas intermedias). La tabla de pginas intermedia (punteros a tablas de pginas). Las tablas de pginas (punteros a pginas).

Cada plataforma sobre la que funciona Linux tiene que proporcionar las macros que permitan al ncleo atravesar las tablas de pgina de cada proceso. De esta forma, el ncleo no necesita conocer el formato de las entradas de la tabla de pginas ni cmo stas se organizan. Esto es tan til que Linux utiliza el mismo cdigo de gestin de tablas de pginas en un procesador Alpha, que tiene tres niveles de tablas de pginas, que en un Intel x86, que slo tiene dos niveles de tablas (para ello, supone que el tamao de la tabla intermedia es 1, y por tanto, coincide con la entrada del directorio).

ASIGNACIN DE PGINAS
Linux utiliza el algoritmo Buddy para asignar y liberar eficientemente bloques de pginas. El cdigo de asignacin intenta asignar un bloque de una o ms pginas fsicas. Las pginas se asignan en bloques de tamao potencia de 2. Esto quiere decir que pueden asignar bloques de 1, 2, 4, etc pginas. El algoritmo de asignacin busca primero entre los bloques de pginas de igual tamao que el pedido. Luego sigue la lista de pginas libres que est encolada. Si no encuentra ningn bloque de pginas del tamao pedido libre, entonces busca en los siguientes (los cuales son del doble del tamao pedido). Puesto que el nmero de pginas de cada bloque es potencia de 2, simplemente dividiendo el bloque por la mitad se obtienen dos bloques con un tamao de bloque inmediatamente inferior.

LIBERACIN DE PGINAS
Asignar bloques de pginas tiende a fragmentar la memoria al dividir los bloques grandes para conseguir bloques ms pequeos. El cdigo de liberacin de pginas recombina pginas en bloques de mayor tamao siempre que es posible. De hecho, el tamao de bloque de pgina es importante pues facilita la recombinacin en bloques grandes. Siempre que se libera un bloque de pginas, se comprueba si est libre el bloque adyacente de igual tamao. Si es as, se combina con el bloque de pginas recin liberado para formar un bloque nuevo de tamao doble. Cada vez que dos bloques de pginas se recombinan en uno mayor, el algoritmo de liberacin intenta volver a recombinarlo en otro an mayor. De esta

forma, los bloques de pginas libres son tan grandes como la utilizacin de la memoria permita.

LA CACHE DE PGINAS LINUX


El cometido de la cache de pginas en Linux es el de acelerar el acceso a los ficheros de disco. Las lecturas sobre los ficheros proyectados en memoria se realizan pgina a pgina y estas pginas se guardan en la cache de pginas. Siempre que se lee en una pgina de un fichero proyectado en memoria, por ejemplo cuando se necesita traer a memoria una pgina desde un fichero de intercambio, la pgina se lee a travs de la cache de pginas. Linux asigna una pgina fsica y lee la pgina desde el fichero del disco. Si es posible, Linux comenzar una lectura de la siguiente pgina del fichero. Con esta pgina de adelanto se consigue que si el proceso est accediendo las pginas de forma secuencial, la siguiente pgina est lista y esperando en memoria la peticin del proceso. Con el tiempo, la cache de pginas va creciendo conforme las imgenes se leen y ejecutan. Las pginas han de ser eliminadas de la cache cuando dejan de utilizarse. Conforme Linux utiliza memoria puede comenzar a escasear las pginas de memoria fsica. En esta situacin Linux reducir el tamao de la cache de pginas.

INTERCAMBIANDO Y LIBERANDO PGINAS EN LINUX


Cuando queda poca memoria fsica, el subsistema de gestin de memoria de Linux tiene que intentar liberar pginas fsicas. Este trabajo es realizado por el demonio de intercambio del ncleo (kswapd). El demonio de intercambio del ncleo es un tipo especial de proceso, un hilo de ejecucin del ncleo (kernel thread). Los hilos del ncleo son procesos que no tienen memoria virtual, en lugar de ello, se ejecutan en modo ncleo en el espacio de memoria fsica. Su misin es la de garantizar que haya suficientes pginas libres en el sistema para mantener al sistema de gestin de memoria funcionando eficientemente. Linux no quiere enviar a disco de intercambio demasiadas pginas a la vez, por lo lleva la cuenta de cuantas pginas estn en ese momento siendo copiadas al fichero de intercambio. Si hay suficientes pginas libres, el demonio de intercambio se duerme hasta que el temporizador expire, en caso contrario, el demonio intenta de tres formas distintas reducir el nmero de pginas fsicas ocupadas:

Reduciendo el tamao de la cache de pginas y el buffer cache, Enviando a disco pginas compartidas, Enviando a disco o descartando pginas.

Si el nmero de pginas libres ha cado demasiado, el demonio de intercambio intentar liberar 6 pginas antes de su prxima ejecucin. En caso contrario, intentar liberar 3 pginas. Los mtodos anteriores se intentan uno tras otro de hasta que se consiguen liberar suficientes pginas. Luego el demonio de intercambio se suspende hasta que el temporizador vuelva a expirar. El demonio recuerda cul fue el ltimo mtodo que emple para liberar pginas, y la prxima vez que se ejecuta lo vuelve a intentar con el mismo mtodo que tuvo xito.

INTERCAMBIO DE PGINAS COMPARTIDAS EN LINUX

El esquema de comparticin de memoria es un mecanismo de comunicacin entre procesos que permite que dos procesos compartan un espacio de memoria virtual para intercambiarse informacin entre ellos. El demonio de intercambio del ncleo tambin utiliza el algoritmo del reloj para intercambiar las pginas compartidas. Cada vez que se ejecuta, recuerda cul fue la ltima pgina de memoria virtual compartida que intercambi. De esta forma se asegura que todas las reas de memoria compartida tienen la misma probabilidad de ser intercambiadas.

INTERCAMBIANDO Y DESCARTANDO PGINAS


El demonio de swap revisa de uno en uno cada proceso del sistema para ver si es un buen candidato para intercambiar algunas de sus pginas. Buenos candidatos son procesos que pueden ser intercambiados (algunos procesos no pueden, p.e. los procesos de tiempo real) y que tienen una o ms pginas que pueden ser enviadas al disco o descartadas de memoria. Las pginas son enviadas al disco slo si los datos que contienen no pueden ser recuperados de otra forma. Una gran cantidad del contenido de una imagen ejecutable viene de la imagen del fichero y puede ser fcilmente reledo desde el mismo fichero. Estas pginas sencillamente se pueden descartar; cuando vuelven a referenciarse por el proceso, stas se traen otra vez a memoria desde la imagen ejecutable del fichero. Una vez se ha localizado un proceso candidato para enviar a disco algunas de sus pginas, el demonio de intercambio examina todas sus regiones de memoria virtual buscando reas que no estn compartidas ni bloqueadas. Linux no intercambiar a disco todas las pginas posibles del proceso que ha sido elegido; slo quitar un pequeo nmero de pginas. Las pginas bloqueadas en memoria no se pueden intercambiar ni descartar. El algoritmo de intercambio de Linux emplea la antigedad de las pginas. Cada pgina tiene un contador que da al demonio de intercambio una cierta idea de si vale la pena o no intercambiar un pgina. Las pginas envejecen cuando no son utilizadas y rejuvenecen cuando son accedidas; el demonio de intercambio slo enva a disco pginas viejas. La accin por defecto cuando se asigna una pgina por primera vez es darle un valor inicial de antigedad de 3. Cada vez que se accede, el valor de antigedad se incrementa en 3 hasta un mximo de 20. Cada vez que el demonio intercambio se ejecuta, envejece las pginas decrementando su valor en 1. Si una pgina es vieja (age = 0), el demonio de intercambio la procesar. Pginas sucias (Dirty) son pginas que se pueden intercambiar.

LA CACHE DE INTERCAMBIO DE LINUX


Cuando se tiene que intercambiar pginas a disco, Linux intenta evitar escribirlas. Hay veces que una pgina est a en un fichero de intercambio y en memoria fsica. Esto sucede cuando una pgina que fue intercambiada a disco ha sido nuevamente leda a memoria principal cuando un proceso la ha necesitado. Mientras la pgina que est en memoria no sea modificada por el proceso, la pgina que est en disco es vlida. Linux utiliza la cache de intercambio para gestionar estas pginas. La cache de intercambio es una lista de entradas de tabla de pginas, una por cada pgina fsica del sistema. Si una entrada en la cache de intercambio es distinta de cero, entonces representa una pgina que est en el

fichero de intercambio que no ha sido modificada. Si la pgina se modifica posteriormente (un proceso escribe sobre ella), su entrada se borra de la cache de intercambio. Cuando Linux necesita enviar una pgina fsica a un fichero de intercambio consulta la cache de intercambio, si hay una entrada vlida para est pgina, entonces no es necesario copiar la pgina al fichero de intercambio. Pues la pgina de memoria no ha sido modificada desde la ltima vez que se ley del fichero de intercambio. Las entradas en la cache de intercambio son entradas de la tabla de pginas de pginas que estn en algn fichero de intercambio. Estn marcadas como invlidas pero contienen informacin que permiten a Linux encontrar el fichero de intercambio y el pgina correcta dentro del fichero de intercambio.

COPY ON WRITE
Copy-on-write es una tcnica para realizar eficientemente (tanto en tiempo como en memoria) la copia de pginas. Linux no duplica las pginas de memoria que son necesarias para un nuevo proceso, sino que hace apuntar las entradas de la tabla de pginas del nuevo proceso a las pginas del proceso padre. Cuando alguna de las pginas es modificada por alguno de los procesos, entonces el ncleo pasa a realizar la duplicacin de dicha pgina. As, Linux se evita la copia de pginas de memoria que no van ha ser utilizadas ahorrando la memoria correspondiente y el tiempo necesario para copiarlas. La forma de llevar a cabo este proceso consiste en establecer los permisos de estas pginas a slo-lectura pero sabiendo que dichas pginas se pueden modificar. Cuando ocurre una violacin de acceso a estas pginas (uno de los procesos intenta escribir) es cuando se realiza la duplicacin propiamente dicha.

You might also like