Die Firma Microsoft hat unter der MIT-Lizenz eine Bibliothek eröffnet, , die für die Implementierung des Speichermanagementsystems entwickelt wurde, das ursprünglich für Runtime-Komponenten von Programmiersprachen gedacht ist. und . Mimalloc ist so konzipiert, dass es in Standardanwendungen ohne Änderungen am Quellcode verwendet werden kann und kann als transparente Alternative zur malloc-Funktion fungieren. Es wird unterstützt auf Windows, macOS, Linux, BSD und anderen Unix-ähnlichen Systemen.
Ein wesentliches Merkmal von mimalloc ist die kompakte Implementierung (weniger als 3500 Codezeilen) und die sehr hohe Leistung. In übertraf mimalloc in der Leistung alle konkurrierenden Speichermanagementbibliotheken, einschließlich , , , und .
Zur Leistungsbewertung wurde ein bestehender Satz von verwendet. In einigen Tests übertrifft mimalloc andere Systeme um ein Vielfaches; beispielsweise war mimalloc im Test für die Migration von Objekten zwischen verschiedenen Threads über 2,5-mal schneller als tcmalloc und jemalloc. Außerdem zeigt sich in den meisten Tests ein geringerer Speicherverbrauch; in einigen Situationen konnte der Speicherverbrauch um 25 % gesenkt werden.

Hohe Leistung wird hauptsächlich durch die Anwendung von Free List Sharding erreicht. Anstelle einer großen Liste verwendet mimalloc eine Reihe kleinerer Listen, die jeweils an einen Speicherseiten gebunden sind. Dieser Ansatz verringert die Fragmentierung und erhöht die Datenlokalität im Speicher. Eine Speicherseite versteht sich als eine gruppierte Menge von Blocks ähnlicher Größe. Auf 64-Bit-Systemen beträgt die Seiten Größe normalerweise 64 KB. Falls auf einer Seite keine belegten Blöcke mehr vorhanden sind, wird sie vollständig freigegeben und der Speicher an das Betriebssystem zurückgegeben, was die Speicherkosten und die Fragmentierung in langlaufenden Programmen reduziert.
Die Bibliothek kann während der Verlinkung eingebunden oder für ein bereits kompiliertes Programm nachgeladen werden ("LD_PRELOAD=/usr/bin/libmimalloc.so myprogram"). In der Bibliothek wird ebenfalls angeboten Um Funktionalitäten zur Laufzeit zu integrieren und das Verhalten präzise zu steuern, zum Beispiel durch das Anbinden von Handlern für verzögertes Freigeben von Speicher und schrittweises Erhöhen von Referenzzählern. Es besteht die Möglichkeit, mehrere „Haufen“ (heap) innerhalb der Anwendung zu erstellen und zu nutzen, um verschiedene Speicherbereiche zu verwalten. Zudem kann der gesamte Heap freigegeben werden, ohne dass eine Durchlaufprüfung und das separate Freigeben der darin enthaltenen Objekte erforderlich ist.
Es besteht die Möglichkeit, die Bibliothek im sicheren Modus zu erstellen, in dem an den Grenzen der Blöcke spezielle Speicherprüfseiten (guard-page) eingesetzt werden, sowie die Randomisierung der Blockverteilung und die Verschlüsselung von Listen der freigegebenen Blöcke genutzt wird. Solche Maßnahmen ermöglichen es, die meisten typischen Techniken zur Ausnutzung von Bufferüberläufen im Heap zu blockieren. Bei Aktivierung des sicheren Modus sinkt die Leistung um etwa 3 %.
Eine der Eigenschaften von mimalloc ist, dass es nicht anfällig für Probleme mit Aufblähungen bei starker Fragmentierung ist. Im schlimmsten Fall steigt der Speicherverbrauch um 0,2 % für Metadaten und kann 16,7 % für verteilten Speicher erreichen. Um Konflikte beim Zugriff auf Ressourcen zu vermeiden, werden in mimalloc ausschließlich atomare Operationen verwendet.
Quelle: opennet.ru
