Frage zu mmap

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Hi,

Ich verstehe die Funktionweise von mmap nicht ganz und hoffe ihr könnt mir das erklären.
mmap "mapped" ja ein file in den Adressraum von meinem Prozess. Gleichzeitig ist aber nicht der ganze RAM, der für das file nötig wäre belegt.

Wie funktioniert das und was heist "mappen" in dem Fall überhaupt ?

Wenn ein file zb 1MB auf der Platte hat, dann werd ich doch auch Adressen für 1MB (im RAM) mappen müssen, und damit sind die doch trotzdem belegt oder nicht ?

...oder "mappt" sich der Prozess da einfach immer nur einen fixen Adressraum und je nachdem was ich von dem file anspreche wird dort entsprechend eingelesen ? Nur dann hat man ja wieder "normale" I/Os und damit keinen Performancegewinn oder ?

Ich hoffe ihr versteht was ich meine :)
BlackJack

@patmaster: „Mappen” heisst auf Deutsch „abbilden”.

Du musst zwischen tatsächlichem, physischem Speicher, der als Hardware in Deinem Rechner steckt, und virtuellem Speicher unterscheiden, also das was Deine Programme sehen. Zur virtuellen Speicherverwaltung mittels Speicherseiten hat zum Beispiel Wikipedia den Artikel „Paging”. Wenn Du eine 1MB-Datei in Deinen Adressraum mappst, dann sind natürlich diese Adressen belegt, aber es muss dafür noch kein physisches RAM belegt werden. Erst wenn Du auf so eine Adresse zugreifst, wird eine Speicherseite aus der Datei in den RAM geladen. Und das Betriebssystem entscheidet auch darüber ob und wann diese physische Speicherseite wieder verworfen und für etwas anderes verwendet wird.

Gewinn dabei ist, dass Du grosse Dateien in den Speicher mappen kannst, und es werden nur die Teile davon geladen, die auch wirklich „angefasst” werden und nur das im physischen Speicher gehalten, was das Betriebssystem als gerade am wichtigsten einschätzt. Je nach Modus werden Daten aus diesem Speicherbereich auch nicht in der Auslagerungsdatei abgelegt, sondern einfach so verworfen beziehungsweise in die Datei zurück geschrieben — denn man kann sie bei Bedarf ja wieder aus der Datei laden.
Sirius3
User
Beiträge: 17754
Registriert: Sonntag 21. Oktober 2012, 17:20

Hi Patmaster,

jedes moderne Betriebsystem hat Auslagerungsdateien, um Teile des Hauptspeichers auf Platte zu schreiben, wenn das eigentliche RAM nicht mehr ausreicht.
Jeder Prozess greift nur auf einen virtuellen Addressraum zu, der je nach CPU 2^31 oder 2^47 oder 2^63 Bytes umfasst. Im virtuellen RAM wird also genug Platz reserviert um die gesamte gemappte Datei unterzubringen. Um das Lesen von der Platte und damit Performanceprobleme kommst Du also nicht drumrum. Da dieses Lesen aber etwas tiefer im Betriebssystem vergraben ist (es werden die gleichen Routinen wie für Auslagerungsdateien verwendet) sparst Du Dir etwas Overhead, den Du bei normaler I/O hättest.
patmaster
User
Beiträge: 106
Registriert: Donnerstag 3. Februar 2011, 17:21

Danke, das Bild wird langsam klarer :)

Ich belege also eigentlich "nur" Adressen und keinen tatsächlichen Speicher. Im Prinzip bin ich also nur vom Adressraum eines Prozesses limitiert.
Antworten