Gestión de memoria en Linux








Gestión de Memoria en Linux


DIRECCIONAMIENTO DE LA MEMORIA VIRTUAL

En lo que respecta a memoria virtual, hace uso de una estructura de tabla de páginas con tres niveles, formada por los siguientes tipos de tablas (cada tabla individual es del tamaño de una página): 

Directorio de páginas: un proceso activo tiene un solo directorio de páginas que es del tamaño de una página. Cada entrada en el directorio de páginas apunta a una página del directorio intermedio de páginas. Para un proceso activo, el directorio de páginas tiene que estar en la memoria principal. 

Directorio intermedio de páginas: este directorio puede ocupar varias páginas y cada entrada de este directorio apunta a una página de la tabla de páginas. 

Tabla de páginas: esta tabla de páginas también puede ocupar varias páginas, y cada entrada de la tabla de página hace referencia a una tabla virtual del proceso.

Para utilizar esta estructura de la tabla de páginas a tres niveles, una dirección virtual en Linux se ve como un conjunto de cuatro campos. El campo más a la izquierda (más significativo) se utiliza como índice en el directorio de páginas. El siguiente campo sirve como índice en el directorio intermedio de páginas. El tercer campo sirve como índice en la tabla de páginas. Y el cuarto y último campo, indica el desplazamiento dentro de la página seleccionada de la memoria.


EL BUDDY SYSTEM (ALOCACIÓN)

El kernel debe establecer una estrategia robusta y eficiente para asignar grupos de marcos de páginas contiguos. Por ello, el objetivo principal del Buddy system es evitar la fragmentación externa.
Desarrolla un sistema que controla los marcos de página contiguos y evita en lo posible dividir un bloque libre grande para una asignación pequeña.

El principio básico del Buddy System es el siguiente:

A cada petición de asignación, se usa la lista no vacía que contiene los grupos de marcos de página de tamaño inmediatamente superior al tamaño especificado, y se selecciona un grupo de páginas de esta lista.

Este grupo se descompone en dos partes: los marcos de página correspondientes al tamaño de memoria especificado, y el resto de marcos de página que siguen disponibles.

 Este resto puede insertarse en las otras listas. Al liberar un grupo de marcos de página, el kernel intenta fusionar este grupo con los grupos disponibles, con el objetivo de obtener un grupo disponible de tamaño máximo


PAGINACIÓN POR DEMANDA

La 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

El proceso que se sigue es el siguiente:

1. Se intenta leer la página requerida

2. Si la página requerida ya esta en memoria, simplemente se lee.

3. Si no está en memoria, revisa si la referencia es válida.

4. Si la referencia es inválida, se aborta.

5. Si la referencia es válida, se intenta cargar la
página.

6. Cuando la página sea cargada, se reintenta la instrucción.



PAGINACIÓN POR ANTIGÜEDAD (LRU - LEAST RECENTLY USED) 

Linux utiliza la técnica de paginación por antigüedad (LRU) 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).


INTERCAMBIO (SWAPPING) EN LINUX 

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 un archivo imagen o de un archivo 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 archivo imagen o de datos.


Por otra parte, si la página había sido modificada, el sistema operativo debe conservar su contenido para que pueda volver a ser accedido.

Este tipo de página se conoce como página modificada (dirty page) y para poderla eliminar de memoria se ha de guardar en un dispositivo de intercambio (dispositivo de swap).

Si el algoritmo utilizado para decidir qué páginas se descartan o se envían a disco (algoritmo de intercambio) no es eficiente, entonces se produce hiperpaginación (thrashing). En este estado, las páginas son continuamente copiadas a disco y luego leídas, con lo que el sistema operativo está demasiado ocupado para hacer trabajo útil.


CACHÉS EN LINUX PARA LA GESTIÓN DE LA MEMORIA

 Linux emplea varios cachés para la gestión de la memoria:

Buffer Caché
Contiene buffers de datos que son utilizados por los gestores de dispositivos de bloques. Estos buffers son de tamaño fijo (por ejemplo 512 bytes) y contienen bloques de información que ha sido bien leída de un dispositivo de bloques o que ha de ser escrita.
El buffer caché (caché de disco formado por buffers, que almacena un único bloque de disco) está indexado vía el identificador de dispositivo y el número de bloque deseado, índice que es utilizado para una rápida localización del bloque.


CACHÉ DE PÁGINAS 

Este caché es un caché de disco formado por páginas, y cada página en el caché corresponde a varios bloques de un archivo regular (normal) o de un archivo de dispositivo de bloque (el número de bloques contenidos en una página depende del tamaño del bloque).

Todos los bloques son contiguos desde un punto de vista lógico (es decir, ellos representan una parte íntegra de un archivo regular o de un archivo de dispositivo de bloque).
Este se utiliza para acelerar el acceso a imágenes y datos en disco.


CACHE DE INTERCAMBIO O SWAP 

Sólo las páginas que han sido modificadas (dirty) se guardan en el dispositivo de intercambio. Mientras no vuelvan a ser modificadas después de haber sido guardadas en el dispositivo de intercambio, la próxima vez que necesiten ser descartadas (swap out) no será necesario copiarlas al dispositivo de intercambio pues ya están allí.
Simplemente se les elimina. En un sistema con mucho trasiego de páginas, esto evita muchas operaciones de disco innecesarias y costosas.


CACHES HARDWARE 

Es un caché normalmente implementada en el propio procesador; la caché de entradas de tabla de página.
En este caso, el procesador no necesita siempre leer la tabla de páginas directamente, sino que guarda en este caché las traducciones de las páginas conforme las va necesitando.






Estos son los  Buffer de Traducción Adelantada (TLB) que contienen copias de las entradas de la tabla de páginas de uno o más procesos del sistema.










Referencias:
| https://kulslide.com/download/gestion-de-memoria-en-linux-_5a059f4cd64ab24a780cf929_pdf
| https://www.tldp.org/LDP/tlk/mm/memory.html
| http://cursos.clavijero.edu.mx/cursos/182_so/modulo3/imagenes/tema3.3.1_clip_image008.jpg
| https://www.maketecheasier.com/manage-swap-usage-linux/

Vía | Alexander Hurtado Cardona

Comentarios

Entradas populares de este blog

Procesos en Linux

Gestión de Archivos