stringtranslate.com

Asignación de losa

La asignación de losa 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 determinado tipo para su reutilización en asignaciones posteriores de objetos del mismo tipo. Es análogo a un grupo de objetos , pero solo se aplica a la memoria, no a otros recursos.

La asignación de losas fue introducida por primera vez en el kernel Solaris 2.4 por Jeff Bonwick . [1] Ahora es ampliamente utilizado por muchos sistemas operativos Unix y similares, incluidos FreeBSD [2] y Linux ; [3] sin embargo, debido a que es un método de asignación obsoleto, actualmente está en desuso y es posible que se elimine pronto del kernel de Linux. [4]

Base

La asignación de losas hace que la práctica muy costosa (en tiempo de CPU) de inicialización y destrucción de objetos de datos del kernel sea poco frecuente, lo que puede superar el costo de asignarles memoria. [1] Cuando el kernel 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 una losa se libera después de su uso, el sistema de asignación de losas generalmente lo mantiene en caché (en lugar de hacer el trabajo de destruirlo) listo para su reutilización la próxima vez. Se necesita 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 cantidad de "bloques" de memoria preasignados; Dentro de cada losa hay fragmentos de memoria de tamaño fijo adecuados para los objetos. [5] El asignador de losa realiza un seguimiento de estos fragmentos, de modo que cuando recibe una solicitud para asignar memoria para un objeto de datos de cierto tipo, normalmente puede satisfacer la solicitud con una ranura libre (fragmento) de un losa 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) de la losa contenedora. La siguiente llamada para crear un objeto del mismo tipo (o asignar memoria del mismo tamaño) devolverá esa ranura de memoria (o alguna otra ranura libre) y la eliminará de la lista de ranuras 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

Comprender el algoritmo de asignación de losas requiere definir y explicar algunos términos:

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

Cuando un programa configura un caché, asigna una cantidad de objetos a las losas asociadas con ese caché. Este número depende del tamaño de las losas asociadas.

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. lleno  : todos los objetos en una losa marcados como usados

Inicialmente, el sistema marca cada losa como "vacía". Cuando el proceso solicita un nuevo objeto del kernel, el sistema intenta encontrar una ubicación libre para ese objeto en una losa parcial en un caché para ese tipo de objeto. Si no existe tal ubicación, el sistema asigna una nueva losa de páginas virtuales contiguas y la asigna a un caché. El nuevo objeto se asigna desde esta losa 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 a partir de un bloque.

Técnicas de implementación

listas gratis

Una losa representa una asignación de memoria al caché de la máquina y cuyo tamaño suele ser un múltiplo del tamaño de la página . La losa se dividirá en una serie de entradas, que luego serán solicitadas por el caché a medida que el código del cliente solicita memoria para nuevos objetos. Es necesario entonces realizar un seguimiento de qué partes de la losa están libres de uso y cuáles ya estaban ocupadas. Esto generalmente se hace usando "listas libres": listas de entradas libres en la losa listas para almacenar nuevos objetos.

La lista libre puede ser una estructura de datos separada, 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 vinculada de punteros, cada uno de los cuales se almacena directamente en el área de memoria libre de la losa que representa. [6]

Tamaños de losa

Los sistemas operativos pueden utilizar diferentes tamaños de losa y diseños internos según el tamaño de los objetos a almacenar. La razón por la que las losas grandes tienen un diseño diferente al de las 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 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 usar una configuración de "losa pequeña", incrustar la lista libre. seguimiento. La presentación original de Bonwick del repartidor de losas ya distinguía los diseños para losas grandes y pequeñas. [1]

Sistemas que utilizan asignación de losas.

Ver también

Notas

  1. ^ abc Jeff Bonwick , The Slab Allocator: un asignador de memoria del kernel de almacenamiento en caché de objetos (1994)
  2. ^ Manual del desarrollador del kernel de FreeBSD
  3. ^ M. Tim Jones, Anatomía del asignador de losas 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 sistema operativo . Wiley: 2004. ISBN  0-471-69466-5
  6. ^ Lameter, Christoph. "Asignadores de losa en el kernel de Linux: SLAB, SLOB, SLUB" (PDF) . LinuxCon/Düsseldorf 2014 (Revisión 3 de octubre de 2014) .
  7. ^ "Documentación del asignador de Gnu Mach".
  8. ^ "Seguridad de la consola: conmutador (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. 334. 
  10. ^ "Perl5-Porters Weekly: 17 de junio de 2012" . Consultado el 18 de noviembre de 2012 .
  11. ^ Bonwick, Jeff. "Revistas y Vmem: ampliación del asignador de losa a muchas CPU y recursos arbitrarios". USENIX 2001 . Consultado el 18 de noviembre de 2012 .

enlaces externos