malloc gegen mmap in C

Lesezeit: 8 Minuten

Benutzeravatar von Peter
Peter

Ich habe zwei Programme erstellt, eines davon mit malloc und andere verwenden mmap. Die Ausführungszeit mit mmap ist viel weniger als zu verwenden malloc.

Ich weiß zum Beispiel, dass, wenn Sie verwenden mmap Sie vermeiden Lese-/Schreibzugriffe auf das System. Und die Speicherzugriffe sind geringer.

Aber gibt es noch andere Gründe für die Vorteile bei der Anwendung? mmap Über malloc?

Danke vielmals

  • Kann ich davon ausgehen, dass Ihr malloc-Programm Read/Write oder fread/fwrite verwendet, um E/A für die Datei auszuführen, die Sie im anderen Fall mmap?

    – Feuer unterdrücken

    15. November 2009 um 23:45 Uhr

  • Ja, eigentlich verwende ich Lesen/Schreiben mit malloc, mmap und die Verwendung normaler R/W-Aufrufe. Die Verwendung von R / W-Aufrufen ist schneller als die Verwendung von malloc, ich denke, das liegt daran, dass der Zugriff auf die Festplatte schneller ist als der Speicher.

    – Petrus

    16. November 2009 um 0:03 Uhr

  • Es ist nicht so, dass der Zugriff auf die Festplatte schneller ist als der Speicher. Fast immer ist der Arbeitsspeicher viel schneller als die Festplatte, und malloc ist nicht das, was Zeit kostet. Der mmap-Code ist schneller, da mmap für Ihr Programm entweder zu weniger Festplattenzugriff oder zu einem effizienteren Festplattenzugriff geführt hat als die Lese- und Schreibvorgänge, mit denen Sie verglichen haben. Zum Beispiel, write Durch das Speichern der gesamten Datei werden tatsächlich alle diese Bytes auf die Festplatte gesendet. mmap bedeutet nur wenn Sie ändern die mmap bearbeitete Daten, dann Das Betriebssystem schreibt die Änderungen. Wenn Sie also am Ende nicht die gesamte Datei ändern, schreiben Sie möglicherweise immer nur einen Bruchteil davon.

    – Steve Jessop

    16. November 2009 um 0:39 Uhr

  • “Ich denke, weil der Zugriff auf die Festplatte schneller ist als der Speicher.” Das ist sehr falsch. Da Sie keinen Code angeben, bin ich mir nicht sicher, wovon Sie genau sprechen, wenn malloc langsamer als mmap ist. Beide Funktionen bilden Adressraum ab, sie weisen nicht notwendigerweise physikalischen Speicher zu. Sie lesen auch keine Dateien. Beide werden physischen Speicher zuweisen, wenn Sie jede Seite verwenden, aber mmap wird dies tun, indem es ihn von der Festplatte liest, was sicherlich langsamer sein wird (harte Seitenfehler im Vergleich zu weichen Seitenfehlern). Lesen/Schreiben-Systemaufrufe können schneller sein als die harten Seitenfehler, abhängig von zahlreichen Faktoren.

    – Elof

    27. Mai 2010 um 6:08 Uhr

  • mmap ermöglicht auch andere Verwendungen, wie das Erstellen eines gemeinsam genutzten Speicherbereichs, mit dem Ihr Prozess mit gegabelten Prozessen kommunizieren kann.

    – Patrick Schlüter

    22. Oktober 2010 um 13:50 Uhr

Schauen Sie, Leute, entgegen der landläufigen Meinung ist mmap tatsächlich eine Speicherzuweisungsfunktion, ähnlich wie malloc.

Die mmaped-Datei ist eine Verwendung davon. Sie können sie als Speicherzuweisungsfunktion verwenden, indem Sie -1 als Dateideskriptor übergeben.

Also … die übliche Verwendung besteht darin, malloc für kleine Objekte und mmap für große zu verwenden.

das ist eine gute strategie..

Ich verwende alloca () nur für Variablen im Funktionsbereich.

  • Normalerweise verwendet der Zuordner mmap selbst je nach Größe des gefragten Bereichs mit malloc. Wenn Sie unter Solaris nach mehr als 128.000 fragen, erhalten Sie a MAP_ANON speicherabgebildeter Block. Unter OS/X beträgt die Grenze 64 KB, wenn ich mich richtig erinnere, andere Systeme und Zuordnungsbibliotheken haben andere Werte.

    – Patrick Schlüter

    22. Oktober 2010 um 13:48 Uhr

Benutzeravatar von Anton
Anton

Ich gehe davon aus, dass Sie sich auf die Verwendung beziehen mmap und malloc zum Lesen von Daten aus Dateien. In diesem Fall haben Sie so ziemlich die Hauptsache verstanden:

  • verwenden fread/fwrite Sie müssen viele Anrufe an das Betriebssystem tätigen.
  • verwenden mmap Sie scheinen in einem Vorgang Zugriff auf die gesamte Datei zu erhalten. Dies ist nicht ganz richtig, da das Betriebssystem wahrscheinlich die Datei eins abbildet Speicher Seite gleichzeitig, aber es ist immer noch viel schneller.

  • Um das zu ergänzen, fread gepuffert ist, bedeutet dies, dass wenn ihm ein fseek vorausgeht, es seinen Puffer immer vollständig füllt. Ich hatte ein Programm, das eine Datei sequentiell las, aber vor einer fseek vor jedem Datensatz (der Größe 32), der 8192 Bytes liest. Am Ende las es also 256-mal mehr Daten als nötig, und das Lesen bestand immer aus zwei Aufrufen des Kernels. Mit mmap Sie haben keine (sichtbar).

    – Patrick Schlüter

    22. Oktober 2010 um 13:44 Uhr


Benutzeravatar von Jeffrey Aylesworth
Jeffrey Aylesworth

mmap lädt die Datei nicht wirklich in den Speicher, daher wird sie schneller geladen, aber die Bearbeitung wird langsamer.

Ein weiterer Punkt ist das mmap verbraucht keinen Speicher, belegt aber Adressraum. Auf einem 64-Bit-Computer hat der größte Teil des Speicheradressraums keinen Speicher, sodass Sie riesige Dateien laden könnten, sagen wir 5 GB, die Sie nicht möchten malloc.

  • “Ein weiterer Punkt ist, dass mmap keinen Speicher verwendet.” Wird es nicht auch eine DMA-Kopie enthalten? Wenn es keinen Speicher verwendet, wie kann der Prozessor dann etwas gegen die Daten tun, die die Datei enthält?

    – RaGa__M

    27. September 2019 um 13:50 Uhr

Sowohl malloc als auch mmap sind manchmal langsam. Es hängt hauptsächlich vom Nutzungsverhalten ab:

mmap: Das Kernel-Paging-Subsystem arbeitet in seitengroßen Einheiten. Das heißt, wenn Sie eine ganze Seite aus einer Datei lesen möchten und dies wiederholt tun möchten (gute Lokalisierung), ist dies mit mmap in Ordnung. Wenn Sie dagegen diese 5-GB-Datei zuordnen und einen verstreuten Zugriff durchführen, werden die Kernel-Seiten häufig ein- und ausgelagert. Neben der eigentlichen Ein-/Ausgabe wird die Seitenverwaltung einige Zeit in Anspruch nehmen. Wenn Sie Bedenken hinsichtlich der Latenz haben, vermeiden Sie dieses Zugriffsmuster, da der Linux-Seitenwiederherstellungsmechanismus dazu neigt, stoßweise zu sein und merkliche Verzögerungen verursacht, und die Cache-Vergiftung andere Prozesse verlangsamt.

malloc: Es ist in Ordnung, wenn Sie Speicher benötigen, der nicht in Seitengrößeneinheiten angegeben ist. aber Sie können Dinge wie mlock() nicht vernünftig machen. In Bezug auf die E/A hängt die Geschwindigkeit sehr stark davon ab, wie Sie es tun. fread/fwrite kann Seiten hinter den Kulissen abbilden oder im Userspace puffern. Lokalisierter Zugriff wird ziemlich schnell sein. Lesen/Schreiben gehen direkt durch den Kernel, so dass kleine verteilte Zugriffe aufgrund von Cache-Fehlern immer noch I/O verursachen, aber die tatsächlichen Daten, die von Kernel->Userspace übertragen werden, werden etwas weniger sein. Ob das messbar ist, weiß ich nicht.

Sofern nicht mlock()’ed, können Benutzerseiten jederzeit ausgelagert/zurückgeschrieben werden. Auch das braucht Zeit. Auf Systemen mit wenig Speicher gewinnt also die Variante, die den wenigsten Speicher abbildet. Mit dem Linux-Kernel hat jedes System zu wenig Speicher, da die ungenutzten Seiten zum Zwischenspeichern von I/O verwendet werden, und der Kernel kann merklich Zeit brauchen, um sie verfügbar zu machen, wenn die Speichernutzung oder I/O sprunghaft ist.

mmap liest die Datei nicht wirklich. Es ordnet es nur dem Adressraum zu. Deshalb ist es so schnell, dass es keine Disc-I/O gibt, bis Sie tatsächlich auf diesen Bereich des Adressraums zugreifen.

malloc ist einfach eine Abbildung des Adressraums auf den Speicher

jcsahnwaldt Stellt Monicas Benutzeravatar wieder her
jcsahnwaldt Wiedereinsetzung von Monica

RAM wird von mmap nicht gewährt. Adressraum wird gewährt.

Wenn auf den Adressraum zugegriffen wird, wird es zu einem Seitenfehler. Während des Seitenfehlers in der Seitengröße, typischerweise 4096 Bytes, wird RAM bereitgestellt.

RAM-Inhalte werden ebenfalls bereitgestellt. Wird der Adressraum durch eine Datei gesichert, so erscheint der Dateiinhalt. Wenn durch MAP_ANONYMOUS der Adressraum gesichert wird, erscheint ein null initialisierter RAM.

Durch das obige werden zwei Wohltaten beschrieben. Zunächst kann genau wie gewünscht RAM initialisiert werden. Zweitens, bis der erforderliche RAM nicht bereitgestellt wird.

Bei einer Adressanfrage von weniger als 2 Megabyte durch malloc wird der Programmabbruch erweitert. Während Adressen in der Nähe der Programmpause bereitgestellt werden, kann die Programmpause nicht gebucht werden. Daher wird freigegebener RAM möglicherweise nicht an den Kernel zurückgegeben. Es folgt eine Analogie. Können Socken vor Schuhen ausgezogen werden?

Per munmap-Aufruf wird sofort der Kernel-RAM zurückgegeben. Durch die Verwendung von mmap und munmap wird die Swap-Wahrscheinlichkeit verringert. Durch das malloc-Programm wird die Wahrscheinlichkeit einer Unterbrechung der Expansionsauslagerung angeregt.

Durch malloc kann weniger als Seitengröße Speicher zugewiesen werden. Diskontinuierliche Erinnerung wird. Kernel-Speicher kann auch fragmentieren. Beides ist nicht perfekt.

Auf jedem untätigen Prozessor kann der Kernel-RAM defragmentiert werden. 2 Megabyte große transparente Riesenseiten entstehen. Im Vergleich zu 512 Seitenfehlern zur Bereitstellung von 2 Mio. Wenn durch einen einzelnen Seitenfehler 2 Mio. bereitgestellt werden können, wird dies zu einem erheblichen Leistungsvorteil.

Bei mmap gibt es mindestens einen nennenswerten Fluch. Für eine mmap-Unterstützung kann ein Pipe-Dateideskriptor verwendet werden. Ein Fehler wird nicht. In der Speicheradresse erscheinen jedoch die von der Pipe bereitgestellten Daten nicht.

Wenn jedoch MAP_ANONYMOUS verwendet wird, können die Daten aus dem Pipe-Dateideskriptor in die von mmap bereitgestellte Adresse gelesen werden. Das gewünschte Ergebnis wird zwar nicht so effizient. Durch eine lseek-fehlgeschlagene Rückgabe und errno kann ein an eine Pipe angehängter Dateideskriptor identifiziert werden.

Bei Computern, die ein ganzes Megabyte adressieren können und auf denen ein plattenbasiertes Betriebssystem ausgeführt wird, ist die Verwendung von Malloc unerlässlich. Wenn Sie die getline-Funktion der C-Bibliothek verwenden, werden wahrscheinlich malloc und free verwendet.

Warum sollten Sie auf einem Kernel-gesteuerten Betriebssystem anstelle von mmap malloc verwenden? Im Vergleich zu malloc; mmap erscheint kompliziert? Um munmap aufzurufen, muss auch die zuvor angeforderte Adressraummenge bereitgestellt werden. Malloc-Nutzung ist portabler? Malloc scheint bequemer zu sein?

Wenn jedoch Leistung gewünscht wird, wird mmap verwendet.

Last, but not least, wenn MAP_SHARED dann mit Nachkommenprozessen Daten geteilt werden können. Das Vermeiden von pthreads ist von größter Bedeutung. Manchmal kann Klonen auch vermieden werden.

Obwohl subjektiv, werden die variablen Zuweisungsmethoden in den am meisten bis am wenigsten bevorzugten aufgelistet: Register/Stapel; mmap; global; malloc. Durch jeden werden verschiedene Segen und Fluch. Durch ein ausreichend kompliziertes Programm; drei oder möglicherweise alle vier Methoden werden verwendet.

1410320cookie-checkmalloc gegen mmap in C

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

Privacy policy