Articulo de referencia

Asignación de losas

La asignación de memoria por bloques es un mecanismo de gestión de memoria diseñado para la asignación eficiente de objetos. En comparación con mecanismos anteriores, reduce la ...

La asignación de memoria por bloques es un mecanismo de gestión de memoria diseñado para la asignación eficiente de objetos. En comparación con mecanismos anteriores, reduce la fragmentación causada por las asignaciones y desasignaciones. Esta técnica se utiliza para conservar 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 similar a un grupo de objetos , pero se aplica únicamente a la memoria, no a otros recursos.

La asignación de bloques fue introducida por primera vez en el kernel Solaris 2.4 por Jeff Bonwick . [ 1 ] Bonwick afirma que el nombre "Slab" proviene de una rima de un eslogan publicitario de cereales Kellogg's : "grab a slab". [ 2 ]

La asignación de bloques ahora es ampliamente utilizada por muchos sistemas operativos Unix y similares a Unix, incluidos FreeBSD [ 3 ] y Linux , [ 4 ] tanto en el asignador SLAB como en su reemplazo, SLUB . [ 5 ]

Base

La asignación de bloques reduce significativamente la frecuencia de la inicialización y destrucción computacionalmente costosas de los objetos de datos del kernel, lo que puede compensar el costo de asignarles memoria. [ 1 ] Cuando el kernel crea y elimina objetos con frecuencia, los costos de sobrecarga de la inicialización pueden resultar en caídas de rendimiento significativas. El almacenamiento en caché de objetos conduce a una invocación menos frecuente de las funciones que inicializan el estado del objeto: cuando un objeto asignado mediante bloques 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 tipo o tamaño específico de objeto de datos tiene varios "bloques" de memoria preasignados; dentro de cada bloque hay fragmentos de memoria de tamaño fijo adecuados para los objetos. [ 6 ] 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 tipo específico, generalmente puede satisfacer la solicitud con una ranura (fragmento) libre de un bloque existente. Cuando se le pide al asignador que libere la memoria del objeto, simplemente agrega la ranura a la lista de ranuras libres (no utilizadas) del bloque que la contiene. La siguiente llamada para crear un objeto del mismo tipo (o asignar memoria del mismo tamaño) devolverá esa ranura de memoria (u otra ranura libre) y la eliminará de la lista de ranuras libres. Este proceso elimina la necesidad de buscar espacio de memoria adecuado y reduce considerablemente la fragmentación de la memoria. En este contexto, un bloque 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 bloques define los siguientes términos:

  1. Caché : Una caché es una pequeña cantidad de memoria muy rápida. Las cachés almacenan el tipo específico de objeto vinculado a este bloque, como semáforos , descriptores de proceso , objetos de archivo , etc. No debe confundirse con la caché de la CPU .
  2. Slab : Un slab es una porción contigua de memoria, generalmente compuesta por varias páginas prácticamente contiguas. El slab es el contenedor real de datos asociados con objetos del tipo específico de la caché que lo contiene.

Cuando un programa configura una caché, asigna una cantidad de objetos a los bloques asociados con dicha 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 sobre una losa marcados como libres
  2. parcial  – la losa consta de objetos usados ​​y libres
  3. lleno  – todos los objetos en una losa marcados como usados

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

La asignación se realiza rápidamente, ya que el sistema construye los objetos con antelación y los asigna fácilmente desde un bloque.

Técnicas de implementación

Listas gratuitas

Un bloque representa una asignación de memoria a la caché desde la máquina, cuyo tamaño suele ser un múltiplo del tamaño de página . El bloque se divide en varias entradas, que la caché solicita cuando el código cliente pide memoria para nuevos objetos. Por lo tanto, es necesario controlar qué partes del bloque están libres y cuáles ya están ocupadas. Esto se suele hacer mediante listas de entradas libres: listas de entradas libres en el bloque, listas para almacenar nuevos objetos.

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

Tamaños de las losas

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

Sistemas que utilizan asignación de bloques

Véase también

Notas

  1. ^ a b c Jeff Bonwick , El asignador de bloques: un asignador de memoria del núcleo con almacenamiento en caché de objetos (1994)
  2. ^ Bonwick, Jeff (14 de junio de 2005). "La historia detrás del asignador de bloques" . Oracle . Archivado del original el 4 de marzo de 2016. Recuperado el 27 de marzo de 2025 .
  3. ^ Manual del desarrollador del kernel de FreeBSD
  4. ^ M. Tim Jones, Anatomía del asignador de bloques de Linux. Archivado el 2 de octubre de 2013 en Wayback Machine.
  5. ^ Vlastimil Babka, elimina el asignador SLAB
  6. ^ Abraham Silberschatz et al .: Conceptos de sistemas operativos . Wiley: 2004. ISBN 0-471-69466-5
  7. ^ Lameter, Christoph. "Asignadores de bloques en el kernel de Linux: SLAB, SLOB, SLUB" (PDF) . LinuxCon/Düsseldorf 2014 (Revisión 3 de octubre de 2014) .
  8. ^ "Documentación del asignador Mach de GNU" .
  9. ^ "Seguridad de la consola – Switch (34c3)" . media.ccc.de . Consultado el 28 de diciembre de 2017 .
  10. ^ 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 .
  11. ^ "Perl5-Porters Weekly: 17 de junio de 2012" . Archivado del original el 11 de octubre de 2012. Consultado el 18 de noviembre de 2012 .
  12. ^ Bonwick, Jeff. "Revistas y Vmem: Extendiendo el asignador de bloques a múltiples CPU y recursos arbitrarios" . USENIX 2001. Recuperado el 18 de noviembre de 2012 .
  • Página del manual de FreeBSD uma(9)
  • Comentario del asignador SLUB sobre la gestión de bloques en Linux mediante 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 solucionan 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? En SLAB y SLUB. Revista de software libre, 2010.
Obtenido de " https://en.wikipedia.org/w/index.php?title=Slab_allocation&oldid=1359110247 "