GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Wie portabel ist mmap?

Das Prinzip einer speicherabgebildeten Datei ist ziemlich portabel, aber Sie haben kein mmap() unter Windows (aber es gibt Dinge wie MapViewOfFile()). Sie können einen Blick auf den C-Code der Python-MMAP-Module werfen, um zu sehen, wie sie es für verschiedene Plattformen tun.


Die Verwendung von mmap zum Lesen von Dateien ist nicht portabel, wenn Sie darauf angewiesen sind, große Teile großer Dateien in Ihren Adressraum abzubilden - 32-Bit-Systeme können leicht keinen einzigen großen nutzbaren Speicherplatz - beispielsweise 1 GB - an verfügbarem Adressraum haben, sodass mmap ziemlich versagen würde häufig für ein 1G-Mapping.


Der mmap() Funktion ist ein POSIX-Aufruf. Es funktioniert gut unter MacOS X (und Linux und HP-UX und AIX und Solaris).

Der Problembereich wird Windows sein. Ich bin mir nicht sicher, ob es einen _mmap() gibt Rufen Sie das POSIX-Untersystem 'Kompatibilität' auf. Es ist wahrscheinlich dort – aber es wird den Namen mit dem führenden Unterstrich haben, da Microsoft eine alternative Sicht auf Namespaces hat und mmap() in Erwägung zieht um in den Benutzernamensraum einzudringen, selbst wenn Sie nach POSIX-Funktionalität fragen. Eine Definition einer alternativen Windows-Oberfläche finden Sie unter MapViewOfFile() und Diskussion über die Leistung in einer anderen SO-Frage (mmap() vs. Leseblockaden).

Wenn Sie versuchen, große Dateien auf einem 32-Bit-System zuzuordnen, stellen Sie möglicherweise fest, dass nicht genügend zusammenhängender Speicherplatz vorhanden ist, um die gesamte Datei im Speicher zuzuweisen, sodass die Speicherzuordnung fehlschlägt. Gehen Sie nicht davon aus, dass es funktionieren wird; Entscheiden Sie, was Ihre Fallback-Strategie ist, wenn sie fehlschlägt.


Ich betrachte Memory Mapped io unter UNIXs als nicht für interaktive Anwendungen verwendbar, da dies zu einem SIGSEGV/SIGBUS führen kann (falls die Datei zwischenzeitlich von einem anderen Prozess abgeschnitten wurde). Wenn man solche kranken "Lösungen" wie setjmp/longjmp ignoriert, gibt es nichts man kann anders tun, als den Prozess nach Erhalt von SIGSEGV/SIGBUS zu beenden Informationen zu diesem G++-Feature sind nirgendwo zu finden. Wir müssen wohl noch ein paar Jahre warten, bis eine strukturierte Ausnahmebehandlung, wie sie seit über 20 Jahren unter Windows zu finden ist, Einzug in UNIXs hält.


Linux
  1. So fügen Sie Swap Space unter Debian 11 hinzu

  2. So fügen Sie Swap Space unter Ubuntu 22.04 hinzu

  3. So fügen Sie unter Linux Auslagerungsspeicher hinzu

  4. So vergrößern Sie den Auslagerungsspeicher unter Linux

  5. Gewusst wie:Freier Speicherplatz durch Reduzierung reservierter Blöcke

So überprüfen Sie die Speicherplatznutzung in Linux

So erhöhen Sie den virtuellen Speicherplatz der VM auf VirtualBox

So überprüfen Sie den freien Speicherplatz unter Linux

Wie erstelle ich einen Hosting-Bereich in solidCP?

So überprüfen Sie den Auslagerungsbereich unter Linux

Wie entferne ich Swap Space von Centos 7.x?