Microsoft a ouvert le code du système d'allocation de mémoire mimalloc

Microsoft a ouvert une bibliothèque sous licence MIT mmalloc à partir d'implémentations d'un système d'allocation de mémoire créé à l'origine pour les composants d'exécution des langages coca и "Lean". Mimalloc est adapté pour être utilisé dans des applications standard sans modifier leur code et peut remplacer de manière transparente la fonction malloc. Prend en charge le travail sur Windows, macOS, Linux, BSD et autres systèmes de type Unix.

La principale caractéristique de mimalloc est son implémentation compacte (moins de 3500 XNUMX lignes de code) et ses très hautes performances. DANS tests effectués mimalloc a surpassé toutes les bibliothèques d'allocation de mémoire concurrentes, notamment jemalloc, tcmalloc, snmalloc, RPMalloc и magot.

Pour évaluer les performances, un ensemble de tests standards Dans certains tests, mimalloc est plusieurs fois plus rapide que d'autres systèmes ; par exemple, lors du test de migration d'objets entre différents threads, mimalloc s'est avéré plus de 2.5 fois plus rapide que tcmalloc et jemalloc. Dans le même temps, dans la plupart des tests, une consommation de mémoire inférieure est également observée ; dans certaines situations, la consommation de mémoire peut être réduite de 25 %.

Microsoft a ouvert le code du système d'allocation de mémoire mimalloc

Les hautes performances sont obtenues principalement grâce à l’utilisation du partage de liste gratuit. Au lieu d'une grande liste, mimalloc utilise une série de listes plus petites, chacune étant liée à une page mémoire. Cette approche réduit la fragmentation et augmente la localité des données en mémoire. Une page mémoire est un ensemble regroupé de blocs de taille similaire. Sur les systèmes 64 bits, la taille de la page est généralement de 64 Ko. S'il ne reste plus de blocs occupés dans la page, celle-ci est complètement libérée et la mémoire est restituée au système d'exploitation, ce qui réduit les coûts de mémoire et la fragmentation des programmes à exécution longue.

La bibliothèque peut être incluse au stade de la liaison ou chargée pour un programme déjà assemblé (« LD_PRELOAD=/usr/bin/libmimalloc.so myprogram »). La bibliothèque propose également API pour intégrer des fonctionnalités dans l'exécution et un contrôle de comportement précis, par exemple, pour connecter des gestionnaires de libération de mémoire paresseux et des compteurs de référence à augmentation monotone. Il est possible de créer et d'utiliser plusieurs « tas » dans une application pour les répartir sur différentes zones mémoire. Il est également possible de libérer entièrement le tas, sans passer par là, et de libérer séparément les objets qui y sont placés.

Il est possible de construire la bibliothèque en mode sans échec, dans lequel des pages spéciales de contrôle de mémoire (pages de garde) sont remplacées aux limites des blocs, et la randomisation de la distribution des blocs et le cryptage des listes de blocs libérés sont utilisés. De telles mesures permettent de bloquer les techniques les plus courantes d'exploitation des dépassements de tampon basés sur le tas. Lorsque vous activez le mode sans échec, les performances diminuent d'environ 3 %.

Parmi les caractéristiques du mimalloc, on note également qu'il n'est pas sujet aux problèmes de ballonnements dus à une fragmentation importante. 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 distribuée. Pour éviter les conflits lors de l'accès aux ressources, mimalloc utilise uniquement des opérations atomiques.

Source: opennet.ru

Ajouter un commentaire