stringtranslate.com

Asignación de losas

La asignación de bloques es un mecanismo de gestión de memoria destinado a la asignación eficiente de memoria de objetos. En comparación con mecanismos anteriores, reduce la fragmentación causada por asignaciones y desasignaciones. Esta técnica se utiliza para retener la memoria asignada que contiene un objeto de datos de un tipo determinado para su reutilización en asignaciones posteriores de objetos del mismo tipo. Es análoga a un grupo de objetos , pero solo se aplica a la memoria, no a otros recursos.

La asignación de slabs fue introducida por primera vez en el núcleo Solaris 2.4 por Jeff Bonwick . [1] Ahora es ampliamente utilizada por muchos sistemas operativos Unix y similares a Unix, incluidos FreeBSD [2] y Linux , [3] tanto en el asignador SLAB como en su reemplazo, SLUB . [4]

Base

La asignación de bloques hace que la práctica muy costosa (en términos de tiempo de CPU) de inicialización y destrucción de objetos de datos del núcleo sea poco frecuente, lo que puede superar el costo de asignarles memoria. [1] Cuando el núcleo crea y elimina objetos con frecuencia, los costos generales de inicialización pueden resultar en caídas significativas del rendimiento. El almacenamiento en caché de objetos conduce a una invocación menos frecuente de funciones que inicializan el estado del objeto: cuando un objeto asignado a un bloque se libera después de su uso, el sistema de asignación de bloques normalmente lo mantiene en caché (en lugar de hacer el trabajo de destruirlo) listo para reutilizarse la próxima vez que se necesite un objeto de ese tipo (evitando así el trabajo de construir e inicializar un nuevo objeto).

Con la asignación de bloques, una caché para un cierto tipo o tamaño de objeto de datos tiene una cantidad de "bloques" de memoria preasignados; dentro de cada bloque hay fragmentos de memoria de tamaño fijo adecuados para los objetos. [5] El asignador de bloques realiza un seguimiento de estos fragmentos, de modo que cuando recibe una solicitud para asignar memoria para un objeto de datos de un cierto tipo, generalmente puede satisfacer la solicitud con un espacio libre (fragmento) de un bloque existente. Cuando se le solicita al asignador que libere la memoria del objeto, simplemente agrega el espacio a la lista de espacios libres (sin usar) del bloque que lo contiene. La siguiente llamada para crear un objeto del mismo tipo (o asignar memoria del mismo tamaño) devolverá ese espacio de memoria (o algún otro espacio libre) y lo eliminará de la lista de espacios libres. Este proceso elimina la necesidad de buscar espacio de memoria adecuado y alivia en gran medida 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

El algoritmo de asignación de losas define los siguientes términos:

  1. Caché : la memoria caché representa una pequeña cantidad de memoria muy rápida. Una memoria caché es un almacenamiento para un tipo específico de objeto , como semáforos , descriptores de procesos , objetos de archivo , etc.
  2. Losa : una losa representa una pieza contigua de memoria, generalmente formada por varias páginas prácticamente contiguas. La losa es el contenedor real de datos asociados con objetos del tipo específico de la caché que los contiene.

Cuando un programa configura una memoria caché, asigna una cantidad de objetos a los bloques asociados a esa memoria caché. Esta cantidad depende del tamaño de los bloques asociados.

Las losas pueden existir en uno de los siguientes estados:

  1. Vacío  : todos los objetos en una losa marcados como libres
  2. Parcial  : la losa consta de objetos usados ​​y libres.
  3. completo  – todos los objetos en una losa marcados como usados

Inicialmente, el sistema marca cada bloque como "vacío". Cuando el proceso solicita un nuevo objeto de kernel, el sistema intenta encontrar una ubicación libre para ese objeto en un bloque parcial en una caché para ese tipo de objeto. Si no existe dicha ubicación, el sistema asigna un nuevo bloque a partir de páginas virtuales contiguas y lo asigna a una caché. El nuevo objeto se asigna desde este bloque y su ubicación se marca como "parcial".

La asignación se realiza rápidamente, porque el sistema construye los objetos con antelación y los asigna fácilmente desde una losa.

Técnicas de implementación

Listas gratuitas

Un slab representa una asignación de memoria a la caché desde la máquina, y cuyo tamaño es habitualmente un múltiplo del tamaño de la página . El slab se dividirá en un número de entradas, que luego serán solicitadas por la caché a medida que el código del cliente solicite memoria para nuevos objetos. Es necesario entonces llevar un registro de qué partes del slab están libres para su uso y cuáles ya estaban ocupadas. Esto se hace generalmente utilizando "listas libres": listas de entradas libres en el slab listas para almacenar nuevos objetos.

La lista libre puede ser una estructura de datos independiente, como una matriz de índices que indican qué entradas de la losa están libres, o puede estar incrustada dentro de la losa. El asignador SLUB de Linux mantiene la lista libre como una lista enlazada de punteros, cada uno de los cuales se almacena directamente en el área de memoria libre de la losa que representan. [6]

Tamaños de losas

Los sistemas operativos pueden utilizar diferentes tamaños de losas y diseños internos según el tamaño de los objetos que se van a almacenar. La razón por la que las losas grandes tienen un diseño diferente al de las losas pequeñas es que permite que las losas grandes se empaqueten mejor en unidades del tamaño de una página, lo que ayuda con la fragmentación. Por ejemplo, los objetos que tienen al menos 1/8 del tamaño de la página para una máquina determinada pueden beneficiarse de un tamaño de "losa grande", con listas libres explícitas, mientras que los objetos más pequeños pueden utilizar una configuración de "losa pequeña", que incluya el seguimiento de la lista libre. La presentación original de Bonwick del asignador de losas ya hacía la distinción entre diseños para losas grandes y pequeñas. [1]

Sistemas que utilizan asignación de losas

Véase también

Notas

  1. ^ abc Jeff Bonwick , The Slab Allocator: un asignador de memoria de kernel con almacenamiento en caché de objetos (1994)
  2. ^ Manual del desarrollador del kernel de FreeBSD
  3. ^ M. Tim Jones, Anatomía del asignador de bloques de Linux Archivado el 2 de octubre de 2013 en Wayback Machine
  4. ^ Vlastimil Babka, elimine el asignador SLAB
  5. ^ Abraham Silberschatz et al .: Conceptos de sistemas operativos . Wiley: 2004. ISBN  0-471-69466-5
  6. ^ Lameter, Christoph. "Asignadores de bloques en el núcleo Linux: SLAB, SLOB, SLUB" (PDF) . LinuxCon/Düsseldorf 2014 (revisión del 3 de octubre de 2014) .
  7. ^ "Documentación del asignador Gnu Mach".
  8. ^ "Seguridad de la consola: Switch (34c3)". media.ccc.de . Consultado el 28 de diciembre de 2017 .
  9. ^ Chris Cooper y Chris Moore, HP-UX 11i Internals , Upper Saddle River, Nueva Jersey: Prentice Hall PTR, 2004, ISBN 0-13-032861-8 , pág. 334. 
  10. ^ "Perl5-Porters Weekly: 17 de junio de 2012" . Consultado el 18 de noviembre de 2012 .
  11. ^ Bonwick, Jeff. "Revistas y Vmem: extensión del asignador de bloques a muchas CPU y recursos arbitrarios". USENIX 2001. Consultado el 18 de noviembre de 2012 .

Enlaces externos