Institut für Computersprachen
Programmiersprachen und Übersetzer
| Diplomarbeit | |
| Titel | Verallgemeinerung von mmap() am Beispiel des Memory Mappings von Pipes in Linux |
| Autor | Syrowatka, Peter |
| Erscheinungsjahr | 2000 |
| Abstract | Memory Mapping (API-Funktion mmap() bietet eine Möglichkeit auf Dateien zuzugreifen. Dabei entfallen Kopieroperationen, die bei Verwendung der normalen I/O-Funktionen read() write() intern durchgeführt werden. Diese Methode wird von den Anwendungsprogrammierern aber nicht sehr oft verwendet, da sie nicht auf Stream-Objekte wie Pipes, Sockets oder Terminals angewendet werden kann. Die Standard-I/O Methoden stellen hier einen Weg zur konsistenten Handhabung der unterschiedlichen Objekte zur Verfügung. Um diesen Nachteil zu eliminieren, stelle ich ein Modell für einen erweiterten mmap()-Aufruf vor. Mit dieser Erweiterung ist es möglich, auch Stream-Objekte in den Adressraum einzublenden. Dadurch kann auch bei Verwendung der alternativen, mmap()-bedingten Programmiermethode eine konsistente Struktur der Programme realisiert und durch die Vermeidung der Kopieroperationen eine Effizienzsteigerung erreicht werden. Die Eigenschaften des Speicherobjektes, welches durch das Einblenden eines Stream-Objektes entsteht, orientieren sich am Verhalten einer eingeblendeten Datei, behält aber einige Eigenheiten des Ursprungsobjektes. So ist zum Beispiel die Grösse einer Pipe oder eines Sockets per Definition unbestimmt. Diese Eigenschaft bleibt auf jeden Fall auch beimn Einblenden erhalten. Abhilfe bietet die Nutzung der großen virtuellen Adressräume, die auf aktuelle Architekturen zur Verfügung stehen. Am Beispiel des Memory Mappings für Pipes spezifiziere ich das Modell des erweiterten mmap() im Detail und unterziehe es einer Prüfung und demonstriere es anhand einer beispielhaften Implementierung für Linux. Das erweiterte Memory Mapping stellt einige Anforderungen an das Virtual Memory Management, vor allem den Übergang der Verwaltung von Page-Granularität auf Byte-Granularität. Als Demonstrations- und Bechmark-Programme habe ich einfache Anwendungen (cat, wc und grep) entsprechend angepasst und zwei Messreihen durchgeführt. Es erfolgte ein Vergleich zwischen den Applikationen auf Standard-I/O- und mmap()-Basis. Dabei schneiden die Programme mit Memory Mapping erwartungsgemäß besser ab (Basissysteme: FreeBSD, SCO, Sun Solaris und Linux). Der Gewinn betrifft vor allem die Systemzeit. Die erhaltenen Messwerte für die Standard-I/O-Methode sind mindestens doppelt so hoch wie bei Verwendung von mmap(). In der zweiten Messreihe wurden die Laufzeiten von Programmen, die über eine Pipe untereinander Daten austasuchen, ermittelt. Der Zufriff erfolgt mit read()/write() oder mit mmap(). Das Ergebnis dieser Messungen entspricht leider nicht ganz den Erwartungen. Aufgrund der nicht optimierten, beispielhaften Implementierung kommt es zu einer leichten Erhöhung der Laufzeit (Gesamt-Zeit steigt ca. um Faktor 1,1 im mmap()-Fall). |
| Status | Verfügbar |