Articulo de referencia

grupo de memoria

Representación de alto nivel de un conjunto de memoria. Los grupos de memoria , también llamados asignación de bloques de tamaño fijo , son el uso de grupos para la gestión de m...

Representación de alto nivel de un conjunto de memoria.

Los grupos de memoria , también llamados asignación de bloques de tamaño fijo , son el uso de grupos para la gestión de memoria que permite la asignación dinámica de memoria . La asignación dinámica de memoria se puede lograr, y de hecho se ha logrado, mediante el uso de técnicas como malloc y el operador new de C++ ; aunque son implementaciones establecidas y confiables, sufren de fragmentación debido a los tamaños de bloque variables, por lo que no se recomienda usarlas en un sistema en tiempo real debido al rendimiento. Una solución más eficiente es preasignar una serie de bloques de memoria del mismo tamaño, denominados grupo de memoria . La aplicación puede asignar, acceder y liberar bloques representados por identificadores en tiempo de ejecución .

Muchos sistemas operativos en tiempo real utilizan grupos de memoria, como la Transaction Processing Facility . POCO ofrece una clase de grupo de memoria Poco::MemoryPool.

Algunos sistemas, como el servidor web Nginx , utilizan el término grupo de memoria para referirse a un conjunto de asignaciones de tamaño variable que posteriormente pueden liberarse todas a la vez. Esto también se conoce como región ; véase gestión de memoria basada en regiones .

Implementación simple de grupo de memoria

Un módulo de gestión de memoria sencillo puede asignar, por ejemplo, tres grupos de memoria en tiempo de compilación con tamaños de bloque optimizados para la aplicación que implementa el módulo. La aplicación puede asignar, acceder y liberar memoria a través de la siguiente interfaz:

  • Asigna memoria desde los grupos. La función determinará el grupo donde se encuentra el bloque requerido. Si todos los bloques de ese grupo ya están reservados, la función intenta encontrar uno en el siguiente grupo más grande. Un bloque de memoria asignado se representa con un identificador .
  • Obtenga un puntero de acceso a la memoria asignada.
  • Libera el bloque de memoria previamente asignado.
  • El identificador puede implementarse, por ejemplo, con un unsigned int. El módulo puede interpretar el identificador internamente dividiéndolo en índice de grupo, índice de bloque de memoria y una versión. El índice de grupo y el índice de bloque de memoria permiten un acceso rápido al bloque correspondiente con el identificador, mientras que la versión, que se incrementa con cada nueva asignación, permite detectar identificadores cuyo bloque de memoria ya está liberado (debido a identificadores retenidos durante demasiado tiempo).

Grupo de memoria frente a malloc

Beneficios

  • Los grupos de memoria permiten la asignación de memoria con un tiempo de ejecución constante. La liberación de memoria para miles de objetos en un grupo se realiza en una sola operación, no uno por uno si se utiliza malloc para asignar memoria a cada objeto.
  • Los grupos de memoria se pueden agrupar en estructuras de árbol jerárquicas, lo cual es adecuado para estructuras de programación especiales como bucles y recursiones .
  • Los grupos de memoria de bloques de tamaño fijo no necesitan almacenar metadatos de asignación para cada asignación, que describan características como el tamaño del bloque asignado. Esto supone un ahorro de espacio considerable, sobre todo para asignaciones pequeñas.
  • Permite un comportamiento determinista en sistemas en tiempo real al evitar errores de falta de memoria.
  • Los bloques de tamaño fijo eliminan el problema de la fragmentación externa: pequeños fragmentos de espacio libre que son demasiado pequeños para ser utilizados. [ 1 ]
  • Los bloques de tamaño fijo admiten la recolección de basura sin movimiento [ 1 ]

Desventajas

  • Es posible que sea necesario ajustar los grupos de memoria para la aplicación que los implementa.
  • Almacenar grandes conjuntos de datos, mayores que un solo bloque, puede obligar al sistema a dispersar el conjunto en muchos bloques del pool, lo que ralentiza las lecturas y escrituras de los elementos del conjunto en comparación con si el conjunto fuera contiguo. [ 1 ]

Véase también

Referencias

  1. 1 2 3 Fridtjof Siebert. "Eliminación de la fragmentación externa en un recolector de basura no móvil para Java" .
  • Grupo de memoria de tamaño fijo, rápido y eficiente
  • PGroup PJ_POOL_GROUP — Documentación del proyecto PJSIP 2.14-dev
  • Un asignador de memoria
  • Programación con grupos de memoria