Frage

Wenn wir eine Datei in dem Speicher der Karte wird ein Systemaufruf erforderlich. Hat nachfolgende Zugriffe auf die Datei benötigen Systemaufrufe oder ist die virtuelle Speicherseite des Prozesses zur eigentlichen Seite Cache im Speicher abgebildet?

Update : was ich will auch wissen, ist, dass, wenn mehrere Prozesse die gleiche Datei durch mmap zugreifen. sie werden den gleichen physikalischen Speicherabschnitt Schreib zugreifen.

War es hilfreich?

Lösung

Keine Notwendigkeit für zusätzliche Systemaufrufe (vom Prozess) , greifen Sie es wie normale Speicher. Wenn Sie mit der Datei fertig sind, nur munmap nennen.

  

Rückgabewert

     

Bei Erfolg mmap()   gibt einen Zeiger auf den zugeordneten Bereich.   Bei einem Fehler wird der Wert MAP_FAILED (das   ist, (void *) -1) zurückgeführt wird, und   errno entsprechend gesetzt. Auf   Erfolg, munmap() 0 zurück, auf   Ausfall -1 und errno gesetzt ist (wahrscheinlich   zu EINVAL).

Siehe Manpage hier für weitere Details .

Bearbeiten Zur Klarstellung:

Ich sage, dass die Funktion ordnet die Datei in den Speicherraum des anrufenden Prozess und gibt einen Zeiger auf den Anfang des Speicherblocks.

Zum Beispiel, wenn Sie zwei verschiedene Prozesse haben Karte die gleiche Datei mit dem MAP_SHARED Flag dann jedem Prozess sein wird, den gleichen physikalischen Speicher zugreifen, aber das Speicher kann in jedem Prozess des virtuellen Speicherplatz an einem anderen Ort zugeordnet werden, dh des Zeiger von mmap in jedem Prozess des virtuellen Speicherraum nicht gleich zurückgeschickt werden.

Dies bringt den Punkt, dass, wenn Sie zum Beispiel Notwendigkeit zu speichern Zeiger innerhalb des gemeinsamen Speicherblock würde diese Zeiger nur dann sinnvoll sein, wenn sie als Offsets relativ zum Anfang des Blocks / Datei gespeichert wurden, und sie würden nur in der Lage sein, Punkt nutzbringend auf Stellen im inneren des Block / Datei.

Andere Tipps

Wenn Sie eine Datei mmap, Linux erstellt Einträge in der MMU (Memory Management Unit). Die MMU wacht über alle lesen und schreiben von der CPU an den realen RAM. Auf diese Weise weiß es, wenn Sie Teile des Speichers zugreifen, die zurück mmap(). Lese Teile, die noch nicht in der realen RAM sind, werden Seitenfehler verursachen. Die MMU wird sie fangen und eine Kernel-Routine rufen Sie den rechten Teil der Datei in dem RAM irgendwo zu laden, und dann wird es den Eintrag in der MMU-Tabelle zu aktualisieren, so scheint es, dass die Daten nun an der Adresse befindet, die mmap() Ihr gab. In der Tat wird es irgendwo anders sein, aber die MMU wird dies völlig transparent machen.

Wenn Sie in den Speicher schreiben, wird die MMU die geänderten Seiten als „dirty“ markieren. Wenn sie ausgespült (weil Sie mehr von der Datei zugreifen, oder weil Sie munmap() nennen), dann werden die Änderungen auf die Festplatte geschrieben werden.

So jedes Mal, wenn ein Seitenfehler und eine schmutzige Seite bündig passiert, passiert ein Systemaufruf. Aber da Seiten sind 4 oder 8 KB, diese passieren selten. Außerdem wird der Kernel mehr als eine einzige Seite zu einem Zeitpunkt geladen werden, so dass die Anzahl von Systemaufrufen wieder reduziert wird. Schließlich wird der gleiche Code verwendet Swapping zu implementieren, so dass es sehr optimiert ist.

All diese Effekte machen Mmap so effizient.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top