Memoria Linux: Principio de funcionamiento

Memoria Linux: Principio de funcionamiento

01.12.2023
Autor: HostZealot Team
2 min.
164

En las especificaciones de los ordenadores, sobre todo de los servidores, se suelen incluir N gigabytes de RAM para indicar la memoria física disponible. La asignación de estos recursos la gestionan los sistemas operativos, de modo que cada aplicación tiene su propio conjunto de recursos, unos espacios de direcciones virtuales, para que cada aplicación funcione como si fuera independiente.

De este modo, los programas no tienen que estar al tanto del uso de memoria de los demás ni de la memoria física total disponible.

Linux utiliza un conjunto jerárquico de estructuras de datos y mecanismos de hardware especializados para rastrear la correspondencia entre la memoria física y la virtual. En conjunto se denominan MMU.

En aras de la eficiencia, la memoria se gestiona en grandes bloques o páginas, cada una de las cuales suele tener un peso de 4 kilobytes.

En Linux, a diferencia de otros sistemas operativos, no se utiliza la segmentación de memoria a nivel de hardware.

El concepto de memoria virtual en Linux engloba tanto la RAM como todas las particiones SWAP.

El proceso de memoria, a su vez, puede ser residente (memoria física real utilizada) o virtual (memoria potencial total disponible). Normalmente, la rss es menor que la vsz.

La partición SWAP es la partición de la unidad donde se colocan los datos raramente utilizados de la memoria residente y, a veces, todos los datos (en caso de que no haya suficiente memoria física). Linux puede trabajar tanto con particiones swap como con archivos swap, permitiendo que los datos de la memoria física sean transferidos a un archivo especial en el disco duro. En este archivo y en la partición de intercambio se utiliza el mismo formato que en la memoria RAM.

La información detallada sobre el uso de memoria de un proceso se almacena en el archivo proc/<pid>/.

La memoria virtual se compone de páginas. Éstas son conjuntos de celdas de memoria en el espacio virtual, que corresponden a la memoria real del disco. La mayoría de las páginas tienen un tamaño estándar de 4 KB, con algunos casos en los que se utilizan páginas más grandes (páginas enormes) (2 megabytes o 1 gigabyte). Las páginas enormes se utilizan para manejar datos de gran tamaño (bases de datos, etc.).

Métodos de gestión del subsistema de memoria

La gestión de la memoria es crucial para el rendimiento del sistema en Linux,

Los métodos de asignación de memoria de Linux incluyen bootmem (asignador básico inicial), buddy (asignación de marcos de páginas contiguas), vmalloc (manejo de áreas de memoria física no contiguas) y kmemcache (asignación de objetos pequeños dentro de marcos de páginas). Estos asignadores sirven para varios propósitos, desde el arranque inicial hasta el manejo de diferentes necesidades de asignación de memoria.

NUMA (acceso no uniforme a la memoria) en sistemas multiprocesador es otro aspecto que Linux gestiona con eficacia. Se encarga de optimizar el acceso a la memoria en función de la proximidad física de la memoria a los procesadores, lo que mejora el rendimiento.

Gestión de la memoria de usuario

Las peticiones alloc_pages() y kmalloc() conducen a la asignación inmediata de memoria, ya que el kernel es el componente más fiable del sistema.

Espacio de direcciones de proceso

El espacio de direcciones de proceso son direcciones lineales a las que acceden los procesos.

Un proceso accede a nuevas áreas de memoria a través de invocaciones: malloc(), calloc(), mmap(), brk(), shmget() + shmat(), posix_memalign(), mmap() basada en void *mmap(void *addr, size_t length, int prot, int flags, int fd, off_t offset).

Descriptor de memoria

mm_struct, el descriptor de memoria contiene toda la información sobre el espacio de direcciones.

Área de memoria

La memoria se divide en dos campos: vm_start y vm_end. Representan la dirección del inicio y del primer bit después del final del área asignada.

Todas las áreas están conectadas en una lista de dos direcciones, donde se ordenan en orden ascendente de direcciones.

Asignación lineal de intervalos de direcciones

Las direcciones lineales asignadas están conectadas al fichero (FILE) o no (ANON), pudiendo el proceso que solicita la memoria compartirlas con otros procesos o tener acceso privado a ellas.

(MAP_SHARED o MAP_PRIVATE).

Asignación diferida

En algunos casos, las solicitudes de procesos de usuario pueden aplazarse hasta que se necesite realmente memoria.

Artículos Relacionados