Erweiterte Funktionalität. Mehr...
Makros | |
| #define | MI_SMALL_SIZE_MAX |
Maximale Größe für kleine Allokationen in mi_malloc_small und mi_zalloc_small (normalerweise 128*sizeof(void*) (= 1 KB auf 64-Bit-Systemen)) | |
Typedefs | |
| typedef void | mi_deferred_free_fun(bool force, unsigned long long heartbeat, void *arg) |
| Typ von Deferred-Free-Funktionen. | |
| typedef void | mi_output_fun(const char *msg, void *arg) |
| Typ von Ausgabefunktionen. | |
| typedef void | mi_error_fun(int err, void *arg) |
| Typ von Fehler-Callback-Funktionen. | |
| typedef int | mi_arena_id_t |
| Mimalloc verwendet große (virtuelle) Speicherbereiche, die vom Betriebssystem als „Arenen“ bezeichnet werden, zur Speicherverwaltung. | |
| typedef void * | mi_subproc_id_t |
| Ein Prozess kann Threads mit Subprozessen verknüpfen. | |
Funktionen | |
| void * | mi_malloc_small (size_t size) |
| Allokiert ein kleines Objekt. | |
| void * | mi_zalloc_small (size_t size) |
| Allokiert ein mit Null initialisiertes kleines Objekt. | |
| size_t | mi_usable_size (void *p) |
| Gibt die verfügbaren Bytes in einem Speicherblock zurück. | |
| size_t | mi_good_size (size_t size) |
| Gibt die genutzte Allokationsgröße zurück. | |
| void | mi_collect (bool force) |
| Gibt Speicher vorzeitig frei. | |
| void | mi_stats_print (void *out) |
| Veraltet. | |
| void | mi_stats_print_out (mi_output_fun *out, void *arg) |
| Gibt die Hauptstatistiken aus. | |
| void | mi_stats_reset (void) |
| Setzt Statistiken zurück. | |
| void | mi_stats_merge (void) |
| Führt Thread-lokale Statistiken mit den Hauptstatistiken zusammen und setzt sie zurück. | |
| void | mi_thread_init (void) |
| Initialisiert mimalloc auf einem Thread. | |
| void | mi_thread_done (void) |
| Deinitialisiert mimalloc auf einem Thread. | |
| void | mi_thread_stats_print_out (mi_output_fun *out, void *arg) |
| Gibt Heap-Statistiken für diesen Thread aus. | |
| void | mi_register_deferred_free (mi_deferred_free_fun *deferred_free, void *arg) |
| Registriert eine Deferred-Free-Funktion. | |
| void | mi_register_output (mi_output_fun *out, void *arg) |
| Registriert eine Ausgabefunktion. | |
| void | mi_register_error (mi_error_fun *errfun, void *arg) |
| Registriert eine Fehler-Callback-Funktion. | |
| bool | mi_is_in_heap_region (const void *p) |
| Ist ein Zeiger Teil unseres Heaps? | |
| int | mi_reserve_os_memory (size_t size, bool commit, bool allow_large) |
| Reserviert OS-Speicher zur Verwendung durch mimalloc. | |
| bool | mi_manage_os_memory (void *start, size_t size, bool is_committed, bool is_large, bool is_zero, int numa_node) |
| Verwaltet einen bestimmten Speicherbereich zur Verwendung durch mimalloc. | |
| int | mi_reserve_huge_os_pages_interleave (size_t pages, size_t numa_nodes, size_t timeout_msecs) |
Reserviert pages riesige OS-Seiten (1 GiB), gleichmäßig verteilt auf numa_nodes Knoten, stoppt aber nach maximal timeout_msecs Sekunden. | |
| int | mi_reserve_huge_os_pages_at (size_t pages, int numa_node, size_t timeout_msecs) |
Reserviert pages riesige OS-Seiten (1 GiB) an einem bestimmten numa_node, stoppt aber nach maximal timeout_msecs Sekunden. | |
| bool | mi_is_in_heap_region () |
Ist die C-Laufzeit-malloc-API umgeleitet? | |
| void | mi_process_info (size_t *elapsed_msecs, size_t *user_msecs, size_t *system_msecs, size_t *current_rss, size_t *peak_rss, size_t *current_commit, size_t *peak_commit, size_t *page_faults) |
| Gibt Prozessinformationen (Zeit- und Speichernutzung) zurück. | |
| void | mi_debug_show_arenas (bool show_inuse, bool show_abandoned, bool show_purge) |
| Zeigt alle aktuellen Arenen an. | |
| void * | mi_arena_area (mi_arena_id_t arena_id, size_t *size) |
| Gibt die Größe einer Arena zurück. | |
| int | mi_reserve_huge_os_pages_at_ex (size_t pages, int numa_node, size_t timeout_msecs, bool exclusive, mi_arena_id_t *arena_id) |
| Reserviert riesige OS-Seiten (1 GiB) in einer einzelnen Arena. | |
| int | mi_reserve_os_memory_ex (size_t size, bool commit, bool allow_large, bool exclusive, mi_arena_id_t *arena_id) |
| Reserviert OS-Speicher, der in einer Arena verwaltet werden soll. | |
| bool | mi_manage_os_memory_ex (void *start, size_t size, bool is_committed, bool is_large, bool is_zero, int numa_node, bool exclusive, mi_arena_id_t *arena_id) |
| Verwaltet extern allokierten Speicher als mimalloc-Arena. | |
| mi_heap_t * | mi_heap_new_in_arena (mi_arena_id_t arena_id) |
| Erstellt einen neuen Heap, der nur in der angegebenen Arena allokiert. | |
| mi_heap_t * | mi_heap_new_ex (int heap_tag, bool allow_destroy, mi_arena_id_t arena_id) |
| Erstellt einen neuen Heap. | |
| mi_subproc_id_t | mi_subproc_main (void) |
| Gibt die Haupt-Subprozess-ID zurück. | |
| mi_subproc_id_t | mi_subproc_new (void) |
| Erstellt einen neuen Subprozess (ohne zugehörige Threads). | |
| void | mi_subproc_delete (mi_subproc_id_t subproc) |
| Löscht einen zuvor erstellten Subprozess. | |
| void | mi_subproc_add_current_thread (mi_subproc_id_t subproc) |
| Fügt den aktuellen Thread zum angegebenen Subprozess hinzu. | |
Erweiterte Funktionalität.
| #define MI_SMALL_SIZE_MAX |
Maximale Größe für kleine Allokationen in mi_malloc_small und mi_zalloc_small (normalerweise 128*sizeof(void*) (= 1 KB auf 64-Bit-Systemen))
| typedef int mi_arena_id_t |
Mimalloc verwendet große (virtuelle) Speicherbereiche, die vom Betriebssystem als „Arenen“ bezeichnet werden, zur Speicherverwaltung.
Jede Arena hat eine zugehörige Kennung.
| typedef void mi_deferred_free_fun(bool force, unsigned long long heartbeat, void *arg) |
Typ von Deferred-Free-Funktionen.
| force | Wenn true, sollten alle offenen Elemente freigegeben werden. |
| heartbeat | Ein monoton steigender Zähler. |
| arg | Argument, das bei der Registrierung übergeben wurde, um zusätzliche Zustandsinformationen zu speichern. |
| typedef void mi_error_fun(int err, void *arg) |
Typ von Fehler-Callback-Funktionen.
| err | Fehlercode (siehe mi_register_error() für eine vollständige Liste). |
| arg | Argument, das bei der Registrierung übergeben wurde, um zusätzliche Zustandsinformationen zu speichern. |
| typedef void mi_output_fun(const char *msg, void *arg) |
Typ von Ausgabefunktionen.
| msg | Auszugebende Nachricht. |
| arg | Argument, das bei der Registrierung übergeben wurde, um zusätzliche Zustandsinformationen zu speichern. |
| typedef void* mi_subproc_id_t |
Ein Prozess kann Threads mit Subprozessen verknüpfen.
Ein Subprozess wird keinen Speicher von (verwaisten Heaps/Threads) anderer Subprozesse zurückfordern.
| void * mi_arena_area | ( | mi_arena_id_t | arena_id, |
| size_t * | size ) |
Gibt die Größe einer Arena zurück.
| arena_id | Die Arena-Kennung. |
| size | Zurückgegebene Größe in Bytes des (virtuellen) Arena-Bereichs. |
| void mi_collect | ( | bool | force | ) |
Gibt Speicher vorzeitig frei.
| force | Wenn true, wird Speicher aggressiv an das Betriebssystem zurückgegeben (kann teuer sein!). |
Normaler Code sollte diese Funktion nicht aufrufen müssen. Sie kann in sehr engen Umständen nützlich sein; insbesondere, wenn ein lang laufender Thread viele Blöcke allokiert, die von anderen Threads freigegeben werden, kann sie die Ressourcennutzung verbessern, indem sie diese Funktion gelegentlich aufruft.
| void mi_debug_show_arenas | ( | bool | show_inuse, |
| bool | show_abandoned, | ||
| bool | show_purge ) |
Zeigt alle aktuellen Arenen an.
| show_inuse | Zeigt die in Benutzung befindlichen Arena-Blöcke an. |
| show_abandoned | Zeigt die verwaisten Arena-Blöcke an. |
| show_purge | Zeigt Arena-Blöcke an, die zur Bereinigung vorgemerkt sind. |
| size_t mi_good_size | ( | size_t | size | ) |
Gibt die genutzte Allokationsgröße zurück.
| size | Die minimal erforderliche Größe in Bytes. |
n, die allokiert wird, wobei n >= size.Im Allgemeinen gilt: mi_usable_size(mi_malloc(size)) == mi_good_size(size). Dies kann verwendet werden, um interne Speicherverschwendung zu reduzieren, z. B. beim Allokieren von Puffern.
| mi_heap_t * mi_heap_new_ex | ( | int | heap_tag, |
| bool | allow_destroy, | ||
| mi_arena_id_t | arena_id ) |
Erstellt einen neuen Heap.
| heap_tag | Der Heap-Tag, der diesem Heap zugeordnet ist; Heaps geben nur Speicher zwischen Heaps mit demselben Tag zurück. |
| allow_destroy | Ist mi_heap_destroy erlaubt? Wenn dies nicht erlaubt ist, kann der Heap Speicher von beendeten Threads zurückgewinnen. |
| arena_id | Wenn nicht 0, allokiert der Heap nur aus der angegebenen Arena. |
NULL im Fehlerfall.Die arena_id kann von Laufzeitsystemen verwendet werden, um nur in einer bestimmten, vorab reservierten Arena zu allokieren. Dies wird z. B. für einen Heap mit komprimierten Zeigern in Koka verwendet. Der heap_tag ermöglicht es Heaps, Objekte eines bestimmten Typs von Heaps mit diesem Tag zu isolieren. Dies wird z. B. in der CPython-Integration verwendet.
| mi_heap_t * mi_heap_new_in_arena | ( | mi_arena_id_t | arena_id | ) |
Erstellt einen neuen Heap, der nur in der angegebenen Arena allokiert.
| arena_id | Die Arena-Kennung. |
NULL.| bool mi_is_in_heap_region | ( | const void * | p | ) |
Ist ein Zeiger Teil unseres Heaps?
| p | Der zu prüfende Zeiger. |
| bool mi_is_redirected | ( | ) |
Ist die C-Laufzeit-malloc-API umgeleitet?
Derzeit nur unter Windows verwendet.
| void * mi_malloc_small | ( | size_t | size | ) |
Allokiert ein kleines Objekt.
| size | Die Größe in Bytes, kann höchstens MI_SMALL_SIZE_MAX betragen. |
| bool mi_manage_os_memory | ( | void * | start, |
| size_t | size, | ||
| bool | is_committed, | ||
| bool | is_large, | ||
| bool | is_zero, | ||
| int | numa_node ) |
Verwaltet einen bestimmten Speicherbereich zur Verwendung durch mimalloc.
Dies ist wie mi_reserve_os_memory, außer dass der Bereich bereits auf irgendeine Weise allokiert und für mimalloc verfügbar sein sollte.
| start | Start des Speicherbereichs |
| size | Die Größe des Speicherbereichs. |
| is_committed | Ist der Bereich bereits committed? |
| is_large | Besteht er aus großen OS-Seiten? Setzen Sie dies ebenfalls auf true für Speicher, der nicht decommittet oder geschützt werden soll (wie RDMA usw.). |
| is_zero | Besteht der Bereich aus Nullen? |
| numa_node | Möglicher zugeordneter NUMA-Knoten oder -1. |
| bool mi_manage_os_memory_ex | ( | void * | start, |
| size_t | size, | ||
| bool | is_committed, | ||
| bool | is_large, | ||
| bool | is_zero, | ||
| int | numa_node, | ||
| bool | exclusive, | ||
| mi_arena_id_t * | arena_id ) |
Verwaltet extern allokierten Speicher als mimalloc-Arena.
Dieser Speicher wird nicht von mimalloc freigegeben.
| start | Startadresse des Bereichs. |
| size | Größe des Bereichs in Bytes. |
| is_committed | Ist der Speicher bereits committed? |
| is_large | Besteht er aus (festen) großen OS-Seiten? |
| is_zero | Ist der Speicher mit Null initialisiert? |
| numa_node | Zugehöriger NUMA-Knoten oder -1 für keine NUMA-Präferenz. |
| exclusive | Ist die Arena exklusiv (d. h. nur Heaps, die mit der Arena verbunden sind, können darin allokieren)? |
| arena_id | Die neue Arena-Kennung. |
true bei Erfolg.| void mi_process_info | ( | size_t * | elapsed_msecs, |
| size_t * | user_msecs, | ||
| size_t * | system_msecs, | ||
| size_t * | current_rss, | ||
| size_t * | peak_rss, | ||
| size_t * | current_commit, | ||
| size_t * | peak_commit, | ||
| size_t * | page_faults ) |
Gibt Prozessinformationen (Zeit- und Speichernutzung) zurück.
| elapsed_msecs | Optional. Abgelaufene Wanduhrzeit des Prozesses in Millisekunden. |
| user_msecs | Optional. Benutzerzeit in Millisekunden (als Summe aller Threads). |
| system_msecs | Optional. Systemzeit in Millisekunden. |
| current_rss | Optional. Aktuelle Größe des physischen Speichers (belegte Seiten). |
| peak_rss | Optional. Maximale Größe des physischen Speichers (belegte Seiten). |
| current_commit | Optional. Aktuell committede Speicher (vom Seitendatei unterstützt). |
| peak_commit | Optional. Maximale committede Speicher (vom Seitendatei unterstützt). |
| page_faults | Optional. Anzahl der harten Seitenfehler. |
Der current_rss ist unter Windows und MacOSX präzise; andere Systeme schätzen dies mit current_commit. Das commit ist unter Windows präzise, wird aber unter anderen Systemen als die von mimalloc reservierte, für Lese-/Schreibzugriff verfügbare Speichermenge geschätzt.
| void mi_register_deferred_free | ( | mi_deferred_free_fun * | deferred_free, |
| void * | arg ) |
Registriert eine Deferred-Free-Funktion.
| deferred_free | Adresse einer Funktion zur verzögerten Freigabe oder NULL zum Abmelden. |
| arg | Argument, das an die Deferred-Free-Funktion übergeben wird. |
Einige Laufzeitsysteme verwenden verzögerte Freigabe, z. B. bei der Verwendung von Referenzzählung zur Begrenzung der Worst-Case-Freigabezeit. Solche Systeme können (wiederaufrufbare) Deferred-Free-Funktionen registrieren, um bei Bedarf mehr Speicher freizugeben. Wenn der Parameter force true ist, sollte aller mögliche Speicher freigegeben werden. Der pro Thread heartbeat-Parameter ist monoton steigend und garantiert deterministisch, wenn das Programm deterministisch allokiert. Die deferred_free-Funktion wird garantiert nach einer bestimmten Anzahl von Allokationen (unabhängig von der Freigabe oder dem verfügbaren freien Speicher) deterministisch aufgerufen. Höchstens eine deferred_free-Funktion kann aktiv sein.
| void mi_register_error | ( | mi_error_fun * | errfun, |
| void * | arg ) |
Registriert eine Fehler-Callback-Funktion.
| errfun | Die Fehlerfunktion, die bei einem Fehler aufgerufen wird (verwenden Sie NULL für die Standardeinstellung). |
| arg | Zusätzliches Argument, das an die Fehlerfunktion übergeben wird. |
Die Funktion errfun wird bei einem Fehler in mimalloc aufgerufen, nachdem eine Fehlermeldung ausgegeben wurde (über die Ausgabefunktion). Es ist immer zulässig, einfach aus der Funktion errfun zurückzukehren, in diesem Fall geben Allokationsfunktionen im Allgemeinen NULL zurück oder ignorieren die Bedingung. Die Standardfunktion ruft nur abort() auf, wenn sie im sicheren Modus mit einem EFAULT-Fehler kompiliert wurde. Die möglichen Fehlercodes sind:
| void mi_register_output | ( | mi_output_fun * | out, |
| void * | arg ) |
Registriert eine Ausgabefunktion.
| out | Die Ausgabefunktion, verwenden Sie NULL für die Ausgabe nach stderr. |
| arg | Argument, das an die Ausgabefunktion übergeben wird. |
Die Funktion out wird aufgerufen, um alle Informationen von mimalloc auszugeben, wie z. B. detaillierte oder Warnmeldungen.
| int mi_reserve_huge_os_pages_at | ( | size_t | pages, |
| int | numa_node, | ||
| size_t | timeout_msecs ) |
Reserviert pages riesige OS-Seiten (1 GiB) an einem bestimmten numa_node, stoppt aber nach maximal timeout_msecs Sekunden.
| pages | Die Anzahl der zu reservierenden 1-GiB-Seiten. |
| numa_node | Der NUMA-Knoten, an dem der Speicher reserviert wird (beginnt bei 0). Verwenden Sie -1 für keine Affinität. |
| timeout_msecs | Maximale Anzahl von Millisekunden für den Reservierungsversuch, oder 0 für kein Timeout. |
Der reservierte Speicher wird von mimalloc zur Erfüllung von Allokationen verwendet. Kann vor Ablauf von timeout_msecs beendet werden, wenn geschätzt wird, dass es mehr als das 1,5-fache von timeout_msecs dauert. Das Zeitlimit ist erforderlich, da es auf einigen Betriebssystemen lange dauern kann, zusammenhängenden Speicher zu reservieren, wenn der physische Speicher fragmentiert ist.
| int mi_reserve_huge_os_pages_at_ex | ( | size_t | pages, |
| int | numa_node, | ||
| size_t | timeout_msecs, | ||
| bool | exclusive, | ||
| mi_arena_id_t * | arena_id ) |
Reserviert riesige OS-Seiten (1 GiB) in einer einzelnen Arena.
| pages | Anzahl der zu reservierenden 1-GiB-Seiten. |
| numa_node | Der zugehörige NUMA-Knoten oder -1 für keine NUMA-Präferenz. |
| timeout_msecs | Maximale Millisekunden, die diese Operation dauern darf. (0 ist unendlich) |
| exclusive | Wenn exklusiv, kann nur ein mit dieser Arena verbundener Heap darin allokieren. |
| arena_id | Die Arena-Kennung. |
| int mi_reserve_huge_os_pages_interleave | ( | size_t | pages, |
| size_t | numa_nodes, | ||
| size_t | timeout_msecs ) |
Reserviert pages riesige OS-Seiten (1 GiB), gleichmäßig verteilt auf numa_nodes Knoten, stoppt aber nach maximal timeout_msecs Sekunden.
| pages | Die Anzahl der zu reservierenden 1-GiB-Seiten. |
| numa_nodes | Die Anzahl der Knoten, auf die die Seiten gleichmäßig verteilt werden sollen, oder 0 für die tatsächliche Anzahl von NUMA-Knoten. |
| timeout_msecs | Maximale Anzahl von Millisekunden für den Reservierungsversuch, oder 0 für kein Timeout. |
Der reservierte Speicher wird von mimalloc zur Erfüllung von Allokationen verwendet. Kann vor Ablauf von timeout_msecs beendet werden, wenn geschätzt wird, dass es mehr als das 1,5-fache von timeout_msecs dauert. Das Zeitlimit ist erforderlich, da es auf einigen Betriebssystemen lange dauern kann, zusammenhängenden Speicher zu reservieren, wenn der physische Speicher fragmentiert ist.
| int mi_reserve_os_memory | ( | size_t | size, |
| bool | commit, | ||
| bool | allow_large ) |
Reserviert OS-Speicher zur Verwendung durch mimalloc.
Reservierte Bereiche werden vor der erneuten Allokation vom Betriebssystem verwendet. Durch die Vorabreservierung eines großen Bereichs kann die Allokation effizienter sein und auf Systemen ohne mmap/VirtualAlloc (wie WASM) besser verwaltet werden.
| size | Die zu reservierende Größe. |
| commit | Speicher sofort committen. |
| allow_large | Große OS-Seiten (2 MiB) verwenden? |
0 bei Erfolg und einen Fehlercode sonst (z. B. ENOMEM).| int mi_reserve_os_memory_ex | ( | size_t | size, |
| bool | commit, | ||
| bool | allow_large, | ||
| bool | exclusive, | ||
| mi_arena_id_t * | arena_id ) |
Reserviert OS-Speicher, der in einer Arena verwaltet werden soll.
| size | Größe der Reservierung. |
| commit | Soll der Speicher initial committet werden? |
| allow_large | Verwendung von großen OS-Seiten erlauben? |
| exclusive | Ist die zurückgegebene Arena exklusiv? |
| arena_id | Die neue Arena-Kennung. |
| void mi_stats_merge | ( | void | ) |
Führt Thread-lokale Statistiken mit den Hauptstatistiken zusammen und setzt sie zurück.
| void mi_stats_print | ( | void * | out | ) |
Veraltet.
| out | Ignoriert, gibt standardmäßig an die registrierte Ausgabefunktion oder stderr aus. |
Am detailliertesten bei Verwendung eines Debug-Builds.
| void mi_stats_print_out | ( | mi_output_fun * | out, |
| void * | arg ) |
Gibt die Hauptstatistiken aus.
| out | Eine Ausgabefunktion oder NULL für die Standardeinstellung. |
| arg | Optionales Argument, das an out übergeben wird (wenn nicht NULL). |
Am detailliertesten bei Verwendung eines Debug-Builds.
| void mi_stats_reset | ( | void | ) |
Setzt Statistiken zurück.
| void mi_subproc_add_current_thread | ( | mi_subproc_id_t | subproc | ) |
Fügt den aktuellen Thread zum angegebenen Subprozess hinzu.
Dies sollte direkt nach der Erstellung eines Threads aufgerufen werden (und bevor eine Allokation stattgefunden hat).
| void mi_subproc_delete | ( | mi_subproc_id_t | subproc | ) |
Löscht einen zuvor erstellten Subprozess.
| subproc | Die Subprozess-Kennung. Löschen Sie nur Subprozesse, wenn alle zugehörigen Threads beendet wurden. |
| mi_subproc_id_t mi_subproc_main | ( | void | ) |
Gibt die Haupt-Subprozess-ID zurück.
| mi_subproc_id_t mi_subproc_new | ( | void | ) |
Erstellt einen neuen Subprozess (ohne zugehörige Threads).
| void mi_thread_done | ( | void | ) |
Deinitialisiert mimalloc auf einem Thread.
Sollte nicht verwendet werden, da dies auf den meisten Systemen (pthreads, Windows) automatisch geschieht. Stellt sicher, dass Speicher, der noch nicht freigegeben wurde (aber von anderen Threads in Zukunft freigegeben wird), ordnungsgemäß behandelt wird.
| void mi_thread_init | ( | void | ) |
Initialisiert mimalloc auf einem Thread.
Sollte nicht verwendet werden, da dies auf den meisten Systemen (pthreads, Windows) automatisch geschieht.
| void mi_thread_stats_print_out | ( | mi_output_fun * | out, |
| void * | arg ) |
Gibt Heap-Statistiken für diesen Thread aus.
| out | Eine Ausgabefunktion oder NULL für die Standardeinstellung. |
| arg | Optionales Argument, das an out übergeben wird (wenn nicht NULL). |
Am detailliertesten bei Verwendung eines Debug-Builds.
| size_t mi_usable_size | ( | void * | p | ) |
Gibt die verfügbaren Bytes in einem Speicherblock zurück.
| p | Zeiger auf zuvor allokierten Speicher (oder NULL). |
Die zurückgegebene Größe kann verwendet werden, um mi_expand erfolgreich aufzurufen. Die zurückgegebene Größe ist immer mindestens gleich der allokierten Größe von p.
| void * mi_zalloc_small | ( | size_t | size | ) |
Allokiert ein mit Null initialisiertes kleines Objekt.
| size | Die Größe in Bytes, kann höchstens MI_SMALL_SIZE_MAX betragen. |