La empresa Microsoft ha liberado bajo la licencia MIT la biblioteca con implementaciones de un sistema de gestión de memoria, originalmente creado para componentes de tiempo de ejecución de lenguajes y . Mimalloc está adaptado para su uso en aplicaciones típicas sin necesidad de modificar su código y puede actuar como un reemplazo transparente de la función malloc. Es compatible con Windows, macOS, Linux, BSD y otros sistemas similares a Unix.
Una característica clave de mimalloc es la compactidad de su implementación (menos de 3500 líneas de código) y su muy alta rendimiento. En mimalloc superó en rendimiento a todas las bibliotecas competidoras de gestión de memoria, incluyendo , , , y .
Para evaluar el rendimiento se utilizó un conjunto de pruebas existentes En algunas pruebas, mimalloc supera a otros sistemas por mucho, por ejemplo, en la prueba de migración de objetos entre diferentes hilos, mimalloc fue más rápido que tcmalloc y jemalloc más de 2.5 veces. Al mismo tiempo, en la mayoría de las pruebas también se observa un menor consumo de memoria, en algunas situaciones los gastos de memoria se lograron reducir en un 25%.

El alto rendimiento se alcanza principalmente gracias a la aplicación de segmentación de la lista de bloques libres (free list sharding). En lugar de una gran lista, mimalloc utiliza una serie de listas más pequeñas, cada una de las cuales se asocia a una página de memoria. Este enfoque reduce la fragmentación y mejora la localización de datos en memoria. Una página de memoria se entiende como un conjunto agrupado de bloques de tamaño similar. En sistemas de 64 bits, el tamaño de la página suele ser de 64 KB. Si no quedan bloques ocupados en la página, se libera completamente devolviendo la memoria al sistema operativo, lo que permite reducir los costos de memoria y la fragmentación en programas de larga duración.
La biblioteca se puede vincular en la fase de enlace o cargar para un programa ya compilado ("LD_PRELOAD=\/usr\/bin\/libmimalloc.so myprogram"). La biblioteca también proporciona para integrar funcionalidades en tiempo de ejecución y un control más fino del comportamiento, por ejemplo, al conectar controladores de liberación de memoria diferida y aumento monotónico de contadores de referencias. Hay opciones para crear y utilizar varias 'montañas' (heap) en la aplicación para distribuirse en diferentes áreas de memoria. También es posible liberar el heap por completo, sin necesidad de recorrer y liberar individualmente los objetos en él.
Se prevé la posibilidad de compilar la biblioteca en modo seguro, en el que se insertan páginas de verificación especiales en los límites de los bloques (guard-page), así como se utiliza la aleatorización de la distribución de bloques y el cifrado de las listas de bloques liberados. Estas medidas permiten bloquear la mayoría de las técnicas típicas de explotación de desbordamientos de buffer en el heap. Al activar el modo seguro, el rendimiento disminuye aproximadamente un 3%.
Entre las características de mimalloc, también se destaca su resistencia a problemas de hinchazón en casos de alta fragmentación. En el peor de los escenarios, el consumo de memoria aumenta en un 0.2% para metadatos y puede alcanzar hasta un 16.7% para la memoria asignada. Para evitar conflictos al acceder a recursos, mimalloc utiliza únicamente operaciones atómicas.
Fuente: opennet.ru
