Das Unternehmen Microsoft hat unter der MIT-Lizenz eine Bibliothek eröffnet mit Implementierungen eines Systems zur Speicherverteilung, das ursprünglich für die Runtime-Komponenten der Sprachen erstellt wurde und . Mimalloc ist für die Verwendung in typischen Anwendungen ohne Änderung ihres Codes angepasst und kann als transparente Alternative zur Funktion malloc dienen. Es unterstützt den Betrieb unter Windows, macOS, Linux, BSD und anderen Unix-ähnlichen Systemen.
Ein Hauptmerkmal von mimalloc ist die kompakte Implementierung (weniger als 3500 Zeilen Code) und die sehr hohe Leistung. In hat mimalloc in der Leistungsfähigkeit alle konkurrierenden Speicherverteilungsbibliotheken übertroffen, einschließlich , , , und .
Zur Leistungsbewertung wurde ein Satz bereits vorhandener In einigen Tests überholt mimalloc andere Systeme um ein Vielfaches, zum Beispiel war beim Test der Objektmigration zwischen verschiedenen Threads mimalloc über 2,5-mal schneller als tcmalloc und jemalloc. Außerdem zeigte es in den meisten Tests auch einen niedrigeren Speicherverbrauch, in einigen Fällen konnte der Speicherverbrauch um 25 % gesenkt werden.

Die hohe Leistung wird hauptsächlich durch die Anwendung der Segmentierung der Liste freier Blöcke (free list sharding) erreicht. Anstelle einer großen Liste werden in mimalloc mehrere kleinere Listen verwendet, von denen jede an eine Seite des Speichers gebunden ist. Dieser Ansatz reduziert die Fragmentierung und erhöht die Lokalisierung der Daten im Speicher. Unter einer Speicherseite versteht man eine gruppierte Menge von Blöcken ähnlicher Größe. Auf 64-Bit-Systemen beträgt die Seitengröße normalerweise 64 KB. Falls in der Seite keine belegten Blöcke mehr vorhanden sind, wird sie vollständig freigegeben und der Speicher an das Betriebssystem zurückgegeben, was dazu beiträgt, den Speicherverbrauch und die Fragmentierung bei langfristig laufenden Programmen zu senken.
Die Bibliothek kann während der Link-Zusammenstellung verbunden oder für ein bereits erstelltes Programm geladen werden („LD_PRELOAD=\/usr\/bin\/libmimalloc.so myprogram“). In der Bibliothek werden auch Möglichkeiten zur Integration von Funktionen zur Laufzeit und zur feinen Steuerung des Verhaltens bereitgestellt, beispielsweise zur Anbindung von Verarbeitern für verzögerte Speicherfreigabe und monotoner Erhöhung von Referenzzählern. Es besteht die Möglichkeit, mehrere „Heaps“ (Heap) im Anwendung zur Verteilung über verschiedene Speicherbereiche zu erstellen und zu verwenden. Auch eine vollständige Freigabe des Heaps ohne Durchlauf und separate Freigabe der darin platzierten Objekte ist möglich.
Es ist möglich, die Bibliothek im Sicherheitsmodus zu kompilieren, in dem an den Blockgrenzen spezielle Guard-Seiten im Speicher eingesetzt werden und randomisierte Blockzuweisungen sowie die Verschlüsselung von freizugebenden Blocklisten verwendet werden. Solche Maßnahmen ermöglichen es, die meisten typischen Techniken zur Ausnutzung von Buffer Overflow in Heaps zu blockieren. Bei Aktivierung des Sicherheitsmoduses sinkt die Leistung um etwa 3%.
Ein merkliches Merkmal von mimalloc ist die Unempfindlichkeit gegenüber Problemen mit Aufblähung bei starker Fragmentierung. Im schlimmsten Fall steigt der Speicherverbrauch um 0,2 % für Metadaten und kann 16,7 % für zugewiesenen Speicher erreichen. Um Konflikte beim Zugriff auf Ressourcen zu vermeiden, verwendet mimalloc ausschließlich atomare Operationen.
Quelle: opennet.ru
