Losa

La versión actual de la página aún no ha sido revisada por colaboradores experimentados y puede diferir significativamente de la versión revisada el 6 de noviembre de 2016; las comprobaciones requieren 7 ediciones .

La asignación de losa (del inglés  slab  - bar, placa [1] ) es un mecanismo de administración de memoria diseñado para asignar memoria de manera más eficiente y eliminar una fragmentación significativa . La base de este algoritmo es almacenar la memoria asignada que contiene un objeto de cierto tipo y reutilizar esta memoria la próxima vez que se asigne para un objeto del mismo tipo. Esta técnica fue introducida por primera vez en SunOS por Jeff Bonwick [2] y ahora se usa ampliamente en los núcleos de muchos sistemas operativos Unix, incluidos FreeBSD y Linux .

Fundación

La idea fundamental detrás de la forma en que se asigna slab se basa en observaciones que muestran que algunos objetos de datos del kernel a menudo se crean y destruyen cuando ya no se necesitan. Así, con cada asignación de memoria para objetos de este tipo, se dedica algo de tiempo a encontrar el lugar más adecuado para este objeto. Además, liberar memoria después de que se destruye un objeto contribuye a una mayor fragmentación de la memoria , lo que ejerce una presión adicional sobre el kernel para reorganizar la memoria.

En el caso de la distribución de losas, cuando el programador usa ciertas llamadas al sistema, las áreas de memoria adecuadas para acomodar objetos de datos de cierto tipo y tamaño están predeterminadas. El asignador de losas almacena información sobre la ubicación de estos tramos, también conocidos como cachés. Por lo tanto, si llega una solicitud para asignar memoria para un objeto de datos de cierto tamaño, puede satisfacer instantáneamente la solicitud con la ranura ya asignada. Sin embargo, la destrucción de los objetos no libera la memoria, solo abre la ranura, que el asignador de losas coloca en la lista de ranuras libres. La próxima llamada para asignar memoria del mismo tamaño devolverá una ranura de memoria que no está actualmente en uso. Este proceso elimina la necesidad de encontrar una ubicación de memoria adecuada y reduce significativamente la fragmentación de la memoria. En este contexto, una losa es una o más páginas contiguas en la memoria que contienen fragmentos de memoria preasignados.

Implementación

Comprender la distribución de losas requiere definir los siguientes términos:

  1. Caché : una caché es una pequeña cantidad de memoria muy rápida. Aquí estamos usando el caché como almacenamiento para almacenar objetos como semáforos , identificadores de procesos , objetos de archivo , etc. Cada caché solo puede almacenar un tipo de objeto.
  2. Losa : una losa es una porción contigua de memoria, generalmente formada por varias páginas físicas contiguas. El caché consta de una o más losas.

Cuando un programa crea un caché, le asigna una cantidad de objetos. Su número depende del tamaño de las losas asociadas. La losa puede estar en uno de los siguientes estados:

  1. vacío  : todos los objetos en la losa se marcan como libres
  2. parcialmente ocupado  - la losa contiene objetos usados ​​y vacíos
  3. relleno  : todos los objetos en la losa se marcan como utilizados

Inicialmente, el sistema marca cada losa como "vacía". Cuando un proceso solicita un nuevo objeto del kernel, el sistema intenta encontrar espacio libre para ese objeto en el caché de losa parcialmente ocupado para ese tipo de objeto. Si no existe tal lugar, el sistema asigna una nueva losa de las páginas físicas adyacentes y las pasa a la memoria caché. Se coloca un nuevo objeto en esta losa y esta ubicación se marca como "parcialmente ocupada".

La principal ventaja del algoritmo de losa es que la memoria se asigna exactamente tanto como sea necesario. Por lo tanto, no hay fragmentación de la memoria interna. La asignación es rápida porque el sistema crea objetos con anticipación y los asigna fácilmente desde la losa.

Losa

Losa: la cantidad de memoria debido a la cual la memoria caché puede crecer o reducirse. Representa la asignación de memoria a la memoria caché y su tamaño suele ser un múltiplo del tamaño de la página de memoria. La losa debe contener una lista de zonas de influencia libres, así como una lista de zonas de influencia que se han asignado (en el caso de una losa grande).

Losas grandes

Diseñado para cachés que almacenan objetos que tienen al menos 1/8 del tamaño de página de la memoria de la máquina. Las losas grandes se estructuran de manera diferente a las losas pequeñas para encajar mejor en las páginas de memoria, evitando así la fragmentación. El slab contiene una lista de controladores de búfer, que son los controladores para cada búfer que se puede asignar (el búfer es la memoria que utilizará el usuario del asignador de slab).

Losas pequeñas

Contener objetos que no excedan 1/8 del tamaño de página de la memoria de la máquina. Deben optimizarse por separado de la estructura lógica, evitando el uso de controladores de búfer (que serían tan grandes como los datos que contienen, lo que provocaría una sobrecarga de memoria mucho mayor). Los bloques pequeños ocupan exactamente una página y tienen una estructura que les permite evitar el almacenamiento en búfer. La última parte de la página contiene el "encabezado de la losa", que es la información necesaria para almacenar la losa. Comenzando en la primera dirección de la página, hay tantos búferes como se pueden asignar sin usar un encabezado de losa al final de la página.

En lugar del uso habitual de controladores de búfer, se utiliza un búfer para almacenar una lista de enlaces libres. Esto le permite prescindir del uso de controladores de búfer en losas pequeñas.

Sistemas que utilizan la distribución de losas

  1. AmigaOS (introducido en 4.0)
  2. DragonFly BSD (introducido en la versión 1.0)
  3. FreeBSD (introducido en 5.0)
  4. Haiku (introducido en alfa 2)
  5. HP-UX (introducido en 11i)
  6. Linux (introducido en el kernel 2.2)
  7. NetBSD (introducido en 4.0)
  8. Solaris (introducido en 2.4)

Notas

  1. Irtegov D. Introducción a los sistemas operativos 2do. edición - BHV ISBN 978-5-94157-695-1 Capítulo 4. Gestión de RAM, página 251; fragmento www.bhv.ru/books/get_pdf_data.php?id=182454
  2. Bonwick, Jeff. "The Slab Allocator: un asignador de memoria kernel de almacenamiento en caché de objetos". Archivado el 10 de noviembre de 2016 en el verano de Wayback Machine USENIX. vol. 16. 1994.  (inglés)

Literatura

Enlaces