Dateien
In den Speicher abgebildete Dateien
(Memory mapped Files)
Grundidee
In einem virtuellem Speicher werden Seiten vom
relativ teueren Hauptspeicher/RAM auf den im billigen Hintergrundspeicher Festplatte befindlichen Swap-Bereich transferiert, falls eine Seite in nächster Zeit entbehrlich ist,
und falls auf eine Seite zugeriffen wird, wird ist auf umgekehrten Weg wieder eingelagert.
Mit dem klassischen Datei API werden mit read(2) und write(2) Inhalte in bzw. aus den Hauptspeicher transferiert. Wenn nun der angegebene Puffer ausgelagert wird, so befindet sich der Dateiinhalt zwei mal auf der Platte...
Daher ist die Idee naheliegend, zusätzlich zu den Swap-bereich Dateien in den Hauptspeicher abzubilden, so daß die Seiten gleich in die Datei transferiert werden.
Vorteil
API
- mmap(2)
- Einblenden einer Datei oder eines Teil davon in
den Adressraum eines Prozesses
- munmap(2)
- Entfernt die Einblendung
- msync(2)
- Erzwingt das schreiben in den Hintergrundspeicher
Recherche im Linux-Kern dazu
- mlock(2)
- Verhindert die Transferierung in den Hintergrundspeicher
Anwendung:
- Echtzeitverarbeitung
- Konsitenzerhaltung von Informationen
- munlock(2),munlockall(2)
- hebt obiges auf
- mprotect(2)
- Setzt die Zugriffsrechte eines Speicherbereiches (z.B. auf nur lesend)
Man kann damit dann Speicherseiten schützen, und bei Schreibzugriff
mittels Signalhandler aktionen ausführen.
Beispiel mprot demonstriert das.
Verwendung
- Dieses API scheint bei den Programmierern nicht sehr bekannt zu sein
- Nach [GrayReuter93]
bevorzugen Transaktionssysteme die klassische API, da sie dann eine explizite Kontrolle über das Lesen- und schreiben hätten.
Allerdings scheinen mlock(2) und msync(2) dies in der gegenwart und Zukunft noch besser zu gewährleisten.
- Ebenfalls nach [GrayReuter93] kennt die IBM AS400 nur so eine Schnittstelle.
Verwendungen im unserem Technologieportal:
- Relative Zeiger in RAMS
- Hier wird eine kleine Bibliothek zur Implementierung persistenter Objekte
versucht.
Fragen zu Implementierungen
- Muessen die unmap-Aufrufe den mmap-Aufrufen entsprechen ?
- Kann man mit MAP_FIXED die Speichersegmente hinteranander aufrufen - Offensichtlich ja
- ... oder sollte man beim Vergößern ein neues mapping vornehmen ?
- Wird dann nicht der Buffercache geräumt und das Laden neu erfolgen ?
Erfahrungen
- mmap auf Datei der Länge 0 ist zwar möglich, beim Zugriff wird das SIGBUS-Signal ausgelöst (linux-2.4.8)
Links
- GNU-Dokumentation memory Mapped I/O
- Gingell u.a: Virtual Memoy Architecture of SunOS
- beschreibt die Zusammenhänge bei der Implementierung
Informatik- und Netzwerkverein Ravensburg e.V
Rudolf Weber