Was ist, wenn ich Speicher mit mmap anstelle von malloc zuweise?

Lesezeit: 3 Minuten

Benutzer-Avatar
MetallicPriest

Was sind die Nachteile der Speicherzuweisung mit mmap (mit MAP_PRIVATE und MAP_ANONYMOUS) als mit malloc? Für Daten im Funktionsumfang würde ich sowieso Stapelspeicher verwenden und daher nicht malloc.

Ein Nachteil, der mir in den Sinn kommt, sind dynamische Datenstrukturen wie Bäume und verknüpfte Listen, bei denen Sie häufig kleine Datenblöcke zuweisen und freigeben müssen. Verwenden mmap es wäre aus zwei Gründen teuer, einer für die Zuweisung bei einer Granularität von 4096 Bytes und der andere für die Notwendigkeit, einen Systemaufruf durchzuführen.

Aber in anderen Szenarien, denken Sie malloc ist besser als mmap? Zweitens überschätze ich den Nachteil mmap für dynamische Datenstrukturen?

Ein Vorteil von mmap Über malloc Ich kann mir vorstellen, dass der Speicher sofort an das Betriebssystem zurückgegeben wird, wenn Sie dies tun munmapwährend mit malloc/freedenke ich, dass der Speicher bis zum Haltepunkt des Datensegments nie zurückgegeben, sondern zur Wiederverwendung aufbewahrt wird.

  • malloc ruft bei Bedarf mmap für Sie auf… Bleiben Sie einfach bei malloc.

    – Macmade

    15. Januar 2012 um 13:33 Uhr

  • Ein weiterer Nachteil besteht darin, dass Sie Ihren Code mit Aufrufen verunreinigen mmapwird es weniger tragbar.

    – Oliver Charlesworth

    15. Januar 2012 um 13:35 Uhr

  • Und warum das Leben komplizierter machen, als es sein muss?

    – Ed heilen

    15. Januar 2012 um 13:37 Uhr

  • Malloc ist besser für kleine Allokationen und für eine hohe Malloc-Rate/frei von nicht so großen Größen. Dies liegt daran, dass malloc einen riesigen Pool nach kleinen Anforderungen fragen und daraus kleine Zuweisungen/Aufhebungen vornehmen kann, ohne mmap/munmap.

    – osgx

    15. Januar 2012 um 14:59 Uhr

  • Der einzige Ort, an dem ich denke, dass dies wirklich nützlich wäre, ist die Implementierung von Speicherpools. Mit malloc lassen Sie sich offen für Fragmentierung. Mit mmap könnten Sie den gesamten Pool an das Betriebssystem zurückgeben, ohne ein winziges Zeichenfolgenfragment (zum Beispiel) am Ende des Adressraums zu hinterlassen.

    – Zan Luchs

    21. August 2013 um 1:33 Uhr

Ja, malloc ist besser als mmap. Es ist viel einfacher zu verwenden, viel feinkörniger und viel tragbarer. Am Ende wird es anrufen mmap ohnehin.

Wenn Sie anfangen, alltägliche Speicherverwaltung mit mmapmöchten Sie eine Möglichkeit implementieren, es in kleinere Stücke als Seiten zu verteilen, und Sie werden am Ende eine Neuimplementierung durchführen malloc – wahrscheinlich auf suboptimale Weise.

  • Großartige ausführliche Antwort, da dies erwähnt wird malloc Anrufe mmap.

    – Jinguo Yao

    1. September 2016 um 9:04 Uhr


Zuerst, mmap() ist ein plattformspezifisches Konstrukt, wenn Sie also planen, portables C zu schreiben, ist es bereits draußen.

Zweite, malloc() ist im Wesentlichen implementiert in Bezug auf mmap()aber es ist eine Art intelligenter Bibliotheks-Wrapper um den Systemaufruf: Es wird bei Bedarf neuen Speicher vom System anfordern, aber bis dahin wird es ein Stück Speicher in einem Bereich auswählen, der bereits für den Prozess festgeschrieben ist.

Wenn Sie also eine normale dynamische Speicherzuordnung durchführen möchten, verwenden Sie malloc(), Ende der Geschichte. Gebrauch von mmap() für die Speicherzuweisung sollte für besondere Situationen reserviert werden (z. B. wenn Sie tatsächlich eine ganze Seite für sich selbst haben möchten, die an der Seitengrenze ausgerichtet ist) und immer in ein einziges Stück Bibliothekscode abstrahiert werden, damit andere leicht verstehen können, was Sie tun.

  • Selbst wenn Sie eine ganze Seite für sich selbst haben möchten, ist es wahrscheinlich besser, sie zu verwenden posix_memalign, ist es schneller zuzuweisen, schneller freizugeben und befreit den Kernel von der Mühe, eine andere vma zu verfolgen. Wirklich der einzige Grund zu verwenden mmap ist, wenn Sie einen Dateideskriptor in den Speicher abbilden möchten (die häufigste Verwendung) oder einen Speicherzuordner implementieren (und selbst dann gibt es gute Gründe, dies zu bevorzugen sbrk).

    – jleahy

    14. Mai 2013 um 20:27 Uhr


Ein Merkmal, das mmap hat das malloc nicht, ist mmap ermöglicht Ihnen die Zuweisung mithilfe von Huge Pages (Flag-Argument hat MAP_HUGETLB eingestellt), während malloc hat diese Möglichkeit nicht.

  • Außerdem können Sie das Betriebssystem auffordern, den gesamten Speicher im Voraus zuzuweisen, um Seitenfehler zu vermeiden (wird für die Programmierung mit geringer Latenz verwendet).

    – Bogi

    22. April 2021 um 16:36 Uhr

1353270cookie-checkWas ist, wenn ich Speicher mit mmap anstelle von malloc zuweise?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy