MMAP verstehen

9

Ich war über die Dokumentation gehe MMAP in Bezug auf hier und versuchte , es zu implementieren mit diesem

Ich habe einige Zweifel an der Umsetzung.

  1. Stellt MMAP eine Zuordnung einer Datei bereit und gibt einen Zeiger auf diesen Speicherort im physischen Speicher zurück oder gibt es eine Adresse der Zuordnungstabelle zurück? und reserviert und sperrt es auch Speicherplatz für diese Datei?

  2. Bleibt die Datei, sobald sie an diesem Speicherort gespeichert ist, dort, bis munmap aufgerufen wird?

  3. Wird die Datei überhaupt in den Speicher verschoben oder handelt es sich nur um eine Zuordnungstabelle, die als Umleitung dient, und die Datei befindet sich tatsächlich im virtuellen Speicher (Festplatte)?

  4. Können andere Prozesse, sofern sie in den Speicher verschoben werden, auf diesen Speicherplatz zugreifen, um Daten zu lesen, wenn sie eine Adresse haben?

John
quelle
2
Sie implementieren nicht ,mmap aber Sie verwenden es
Basile Starynkevitch

Antworten:

12

Dinge in der richtigen Reihenfolge beantworten:

  1. Es gibt einen Zeiger auf den Speicherort im virtuellen Speicher zurück, und der Adressraum des virtuellen Speichers wird zugewiesen, aber die Datei wird in keiner Weise gesperrt, es sei denn, Sie sperren sie explizit (beachten Sie auch, dass das Sperren des Speichers nicht mit dem Sperren des Bereichs im virtuellen Speicher identisch ist Datei). Eine effiziente Implementierung von mmap () ist aufgrund von Paging und virtuellem Speicher nur aus praktischer Sicht möglich (andernfalls müsste der gesamte Bereich vor Abschluss des Aufrufs in den Speicher eingelesen werden).
  2. Nicht genau, dies hängt jedoch mit der nächsten Antwort zusammen, also werde ich es dort behandeln.
  3. So'ne Art. In den meisten Fällen passiert tatsächlich, dass mmap () beim Schreiben Kopierzugriff auf die Daten dieser Datei im Seitencache bietet. Infolgedessen gelten die üblichen Cache-Einschränkungen für die Datenlebensdauer (wenn das System Speicherplatz benötigt, können Seiten aus dem Cache entfernt (oder auf die Festplatte geleert werden, wenn sie verschmutzt sind) und müssen erneut fehlerhaft sein.
  4. Nein, aufgrund der Funktionsweise des virtuellen Speichers. Jeder Prozess verfügt über einen eigenen virtuellen Adressraum mit eigenen virtuellen Zuordnungen. Jedes Programm, das Daten kommunizieren möchte, muss mmap () in derselben Datei (oder demselben gemeinsam genutzten Speichersegment) aufrufen und alle müssen das MAP_SHAREDFlag verwenden.

Es ist erwähnenswert, dass mmap () nicht nur für Dateien funktioniert, sondern Sie können auch andere Dinge damit tun, wie zum Beispiel:

  • Gerätespeicher direkt zuordnen (wenn Sie über ausreichende Berechtigungen verfügen). Dies wird tatsächlich auf vielen eingebetteten Systemen verwendet, um zu vermeiden, dass Kernelmodustreiber für neue Hardware geschrieben werden müssen.
  • Ordnen Sie gemeinsam genutzte Speichersegmente zu.
  • Ordnen Sie große Seiten explizit zu.
  • Weisen Sie Speicher zu, für den Sie madvise (2) aufrufen können (mit dem Sie nützliche Aktionen ausführen können, z. B. verhindern, dass Daten in Fork (2) in einen untergeordneten Prozess kopiert werden, oder Daten für KSM markieren (Linux-Speicher-Deduplizierungsfunktion)).
Austin Hemmelgarn
quelle
Vielen Dank für eine so ausführliche Antwort. Nur eine Klarstellung zu Punkt 1. Wenn ich versuche, auf die zurückgegebene Adresse des virtuellen Speichers zuzugreifen. Es wird zuerst die für den Prozess erstellte Adresszuordnung durchlaufen und dann an den tatsächlichen Speicherort umgeleitet - dies kann Festplatte, Cache oder Speicher sein. Zweitens, wenn das MAP_SHARED-Flag aktiviert ist und die Tabelle für beide Prozesse den gleichen Wert für die physische Adresse zurückgibt, dann die Datei kann geteilt werden?
John
1. Ja, es wird die Zuordnungstabelle für den virtuellen Speicher verwendet. 2. Die Adresse in jedem Prozess spielt keine Rolle, nur die Tatsache, dass sie mit MAP_SHARED denselben Bereich derselben Datei zugeordnet haben.
Austin Hemmelgarn