La société Microsoft a publié sous licence MIT une bibliothèque avec des implémentations d'un système de gestion de la mémoire, à l'origine conçu pour les composants runtime des langages et . Mimalloc est adapté à une utilisation dans des applications standard sans modification de leur code et peut servir de remplacement transparent à la fonction malloc. Il prend en charge le fonctionnement sous Windows, macOS, Linux, BSD et d'autres systèmes de type Unix.
La caractéristique clé de mimalloc est la compacité de son implémentation (moins de 3500 lignes de code) et sa très haute performance. Dans mimalloc a surpassé en performance toutes les bibliothèques concurrentes de gestion de la mémoire, y compris , , , et .
Pour évaluer les performances, un ensemble de tests standard existants a été utilisé Dans certains tests, mimalloc surpasse d'autres systèmes de manière significative, par exemple, dans le test de migration d'objets entre différents threads, mimalloc s'est avéré plus rapide que tcmalloc et jemalloc de plus de 2,5 fois. Dans la plupart des tests, une consommation de mémoire plus faible est également observée, dans certaines situations, la consommation de mémoire peut être réduite de 25%.

La haute performance est principalement due à l'application de la segmentation de la liste des blocs libres (free list sharding). Au lieu d'une grande liste, mimalloc utilise une série de plus petites listes, chacune étant liée à une page de mémoire. Cette approche réduit la fragmentation et améliore la localisation des données en mémoire. Une page de mémoire est entendue comme un ensemble groupé de blocs de taille similaire. Sur les systèmes 64 bits, la taille de la page est généralement de 64 Ko. Si aucune bloc occupé ne reste dans la page, elle est complètement libérée en retournant la mémoire au système d'exploitation, ce qui permet de réduire les coûts de mémoire et la fragmentation dans les programmes s'exécutant longtemps.
La bibliothèque peut être liée au moment de la liaison ou chargée pour un programme déjà compilé (« LD_PRELOAD=/usr/bin/libmimalloc.so myprogram »). La bibliothèque fournit également pour l'intégration de fonctionnalités à l'exécution et le contrôle fin du comportement, par exemple, pour connecter des gestionnaires de libération de mémoire retardée et l'augmentation monotone des compteurs de références. Il est possible de créer et d'utiliser dans l'application plusieurs « tas » (heap) pour répartir la mémoire dans différentes zones. Cela inclut la possibilité de libérer entièrement le tas, sans itération ni libération séparée des objets qui y sont placés.
Il est prévu de pouvoir compiler la bibliothèque en mode sécurisé, où à la frontière des blocs, des pages de mémoire de vérification spéciales (guard-page) sont insérées, ainsi qu'une randomisation de la distribution des blocs et le chiffrement des listes de blocs libérés. Ces mesures permettent de bloquer la plupart des techniques d'exploitation des débordements de tampon dans le tas. En activant le mode sécurisé, la performance diminue d'environ 3%.
Parmi les caractéristiques de mimalloc, il est également à noter qu'il n'est pas sujet aux problèmes de gonflement en cas de forte fragmentation. Dans le pire des cas, la consommation de mémoire augmente de 0,2 % pour les métadonnées et peut atteindre 16,7 % pour la mémoire allouée. Pour éviter les conflits d'accès aux ressources, mimalloc ne utilise que des opérations atomiques.
Source : opennet.ru
