Microsoft hat den Code für das mimalloc-Speicherzuweisungssystem geöffnet

Microsoft hat eine Bibliothek unter der MIT-Lizenz eröffnet mmalloc aus Implementierungen eines Speicherzuweisungssystems, das ursprünglich für Laufzeitkomponenten von Sprachen erstellt wurde Koka и Lehnen. Mimalloc ist für die Verwendung in Standardanwendungen ohne Änderung des Codes angepasst und kann als transparenter Ersatz für die Malloc-Funktion dienen. Unterstützt die Arbeit unter Windows, macOS, Linux, BSD und anderen Unix-ähnlichen Systemen.

Das Hauptmerkmal von mimalloc ist seine kompakte Implementierung (weniger als 3500 Codezeilen) und seine sehr hohe Leistung. IN Tests durchgeführt mimalloc übertraf alle konkurrierenden Speicherzuweisungsbibliotheken, einschließlich jemalloc, tcmalloc, kleinloc, rpmalloc и horten.

Um die Leistung zu bewerten, ist eine Reihe vorhandener Standardtests In einigen Tests ist mimalloc um ein Vielfaches schneller als andere Systeme; beim Test der Objektmigration zwischen verschiedenen Threads erwies sich mimalloc beispielsweise als mehr als 2.5-mal schneller als tcmalloc und jemalloc. Gleichzeitig ist in den meisten Tests auch ein geringerer Speicherverbrauch zu beobachten; in manchen Situationen kann der Speicherverbrauch um 25 % reduziert werden.

Microsoft hat den Code für das mimalloc-Speicherzuweisungssystem geöffnet

Eine hohe Leistung wird vor allem durch den Einsatz von Free List Sharding erreicht. Anstelle einer großen Liste verwendet mimalloc eine Reihe kleinerer Listen, von denen jede an eine Speicherseite gebunden ist. Dieser Ansatz reduziert die Fragmentierung und erhöht die Datenlokalität im Speicher. Eine Speicherseite ist ein gruppierter Satz von Blöcken ähnlicher Größe. Auf 64-Bit-Systemen beträgt die Seitengröße typischerweise 64 KB. Wenn auf der Seite keine belegten Blöcke mehr vorhanden sind, wird sie vollständig freigegeben und der Speicher wird an das Betriebssystem zurückgegeben, was Speicherkosten und Fragmentierung bei lang laufenden Programmen reduziert.

Die Bibliothek kann beim Linken eingebunden oder für ein bereits zusammengestelltes Programm geladen werden („LD_PRELOAD=/usr/bin/libmimalloc.so myprogram“). Die Bibliothek bietet auch API zur Integration von Funktionalität in die Laufzeit und zur feinkörnigen Verhaltenssteuerung, beispielsweise zur Anbindung von Lazy-Memory-Release-Handlern und monoton steigenden Referenzzählern. Es ist möglich, in einer Anwendung mehrere „Heaps“ zu erstellen und zu verwenden, um sie auf verschiedene Speicherbereiche zu verteilen. Es ist auch möglich, den Heap vollständig freizugeben, ohne die darin platzierten Objekte einzeln freizugeben.

Es ist möglich, die Bibliothek in einem abgesicherten Modus zu erstellen, in dem spezielle Speicherprüfseiten (Guard-Pages) an den Blockgrenzen ersetzt werden und eine Randomisierung der Blockverteilung und eine Verschlüsselung von Listen freigegebener Blöcke verwendet werden. Solche Maßnahmen ermöglichen es, die gängigsten Techniken zur Ausnutzung von Heap-basierten Pufferüberläufen zu blockieren. Wenn Sie den abgesicherten Modus aktivieren, verringert sich die Leistung um etwa 3 %.

Zu den Merkmalen von mimalloc gehört auch, dass es aufgrund der großen Fragmentierung nicht anfällig für Probleme mit Blähungen ist. Im schlimmsten Fall steigt der Speicherverbrauch für Metadaten um 0.2 % und kann für verteilten Speicher 16.7 % erreichen. Um Konflikte beim Zugriff auf Ressourcen zu vermeiden, verwendet mimalloc nur atomare Operationen.

Source: opennet.ru

Kommentar hinzufügen