364 Stimmen

Wann sollte ich mmap für den Dateizugriff verwenden?

POSIX-Umgebungen bieten mindestens zwei Möglichkeiten, auf Dateien zuzugreifen. Es gibt die Standard-Systemaufrufe open() , read() , write() und Freunde, aber es gibt auch die Möglichkeit, mit mmap() um die Datei im virtuellen Speicher abzubilden.

Wann ist es besser, das eine zu verwenden als das andere? Welche individuellen Vorteile sprechen dafür, zwei Schnittstellen einzubeziehen?

6voto

TrentP Punkte 3708

Ein Vorteil, der noch nicht aufgeführt ist, ist die Möglichkeit der mmap() eine Nur-Lese-Zuordnung als sauber Seiten. Wenn man einen Puffer im Adressraum des Prozesses zuweist und dann read() um den Puffer aus einer Datei zu füllen, werden die diesem Puffer entsprechenden Speicherseiten nun schmutzig da sie angeschrieben worden sind.

Schmutzige Seiten können vom Kernel nicht aus dem RAM gelöscht werden. Wenn Swap-Speicherplatz vorhanden ist, können sie in den Swap-Speicher ausgelagert werden. Dies ist jedoch kostspielig, und auf einigen Systemen, wie z. B. kleinen eingebetteten Geräten mit nur Flash-Speicher, gibt es überhaupt keinen Swap-Speicher. In diesem Fall verbleibt der Puffer im RAM, bis der Prozess beendet wird, oder er gibt ihn vielleicht mit madvise() .

Nicht geschrieben an mmap() Die Seiten sind sauber. Wenn der Kernel Arbeitsspeicher benötigt, kann er sie einfach löschen und den Arbeitsspeicher verwenden, in dem sich die Seiten befanden. Wenn der Prozess, der die Zuordnung hatte, erneut darauf zugreift, kommt es zu einem Seitenfehler, und der Kernel lädt die Seiten erneut aus der Datei, aus der sie ursprünglich stammen. Auf die gleiche Weise, wie sie ursprünglich angelegt wurden.

Dazu ist es nicht erforderlich, dass mehr als ein Prozess die zugeordnete Datei verwendet, um einen Vorteil zu haben.

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X