Articulo de referencia

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 fra...

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 reduce significativamente la frecuencia de inicialización y destrucción de objetos de datos del núcleo, que son costosas en términos computacionales, lo que puede compensar 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 determinado tipo o tamaño de objeto de datos tiene una serie 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 lleva un registro de estos fragmentos, de modo que cuando recibe una solicitud para asignar memoria para un objeto de datos de un determinado tipo, normalmente puede satisfacer la solicitud con un espacio libre (fragmento) de un bloque existente. Cuando se le pide al asignador que libere la memoria del objeto, simplemente añade 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 se compone tanto de objetos usados ​​como de objetos 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

  • AmigaOS (introducido en AmigaOS 4 )
  • DragonFly BSD (introducido en la versión 1.0)
  • FreeBSD (introducido en 5.0)
  • GNU Mach [7]
  • Haiku (introducido en la versión alfa 2)
  • Horizon ( microkernel de Nintendo Switch ) [8]
  • HP-UX (introducido en 11i) [9]
  • Linux (introducido en el kernel 2.1.23, ahora es una de las tres implementaciones de asignadores de memoria junto con SLOB y SLUB . Los tres asignadores proporcionan una especie de interfaz para el asignador de amigos por zonas para aquellas secciones del kernel que requieren una asignación de memoria más flexible que el tamaño de página estándar de 4 KB).
  • NetBSD (introducido en 4.0)
  • Solaris (introducido en 2.4)
  • El compilador de Perl 5 utiliza un asignador de losas para la gestión de memoria interna [10] [11]
  • Memcached utiliza la asignación de bloques para la gestión de memoria
  • Ilumos

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 .
  • Página del manual uma(9) de FreeBSD
  • El asignador SLUB comenta sobre la gestión de losas en Linux por dos asignadores diferentes: el asignador SLUB y el asignador SLAB
  • Compactación de memoria v7 (un conjunto de parches para Linux de Mel Gorman que aborda problemas de fragmentación y compactación de SLAB, 2 de abril de 2010)
  • Detección de fugas de memoria del kernel Jonathan Corbet, Linux Weekly News, 2006; incluye comentarios de usuarios sobre la recolección de basura
  • Rendimiento de Linux: ¿se está volviendo Linux demasiado lento y pesado? Sobre SLAB y SLUB. Revista de software libre 2010.
Obtenido de "https://es.wikipedia.org/w/index.php?title=Asignación_de_losas&oldid=1258766162"