Linux-Speicherverwaltung von anderen Systemen unterscheidet. Das Schlüsselprinzip ist, dass Speicher, der nicht verwendet wird, Speicher verschwendet. In vielerlei Hinsicht versucht Linux, die Speichernutzung zu maximieren, was (meistens) zu einer besseren Leistung führt.
Es ist nicht, dass "nichts funktioniert" in Linux, aber dass sein Verhalten ein wenig anders ist, als Sie erwarten.
Wenn Speicherseiten aus der mmapped-Datei gezogen werden, muss das Betriebssystem entscheiden, welche physikalischen Speicherseiten es freigeben (oder auslagern) soll. Es wird nach Seiten gesucht, die leichter auswechselbar sind (erfordern kein sofortiges Schreiben auf der Festplatte) und werden wahrscheinlich seltener erneut verwendet.
Der POSIX-Aufruf madvice() dient dazu, dem System mitzuteilen, wie Ihre Anwendung die Seiten verwendet. Aber wie der Name sagt, ist es eine Beratung, so dass das Betriebssystem besser in Paging-und Swapping-Entscheidungen instrumentiert ist. Es ist weder eine Politik noch eine Bestellung.
Um die Auswirkungen von madvice() auf Linux zu demonstrieren, habe ich eine der Übungen geändert, die ich meinen Schülern gebe. Siehe complete source code here. Mein System ist 64-Bit und hat 2 GB RAM, was etwa 50% ist jetzt in Betrieb. Verwenden Sie das Programm, um eine 2-GB-Datei zu mappen, lesen Sie sie nacheinander und löschen Sie alles. Es meldet RSS-Nutzung alle 200 MB gelesen wird.Die Ergebnisse ohne madvice():
<[email protected]> ~% ./madvtest file.dat n
0 : 3 MB
200 : 202 MB
400 : 402 MB
600 : 602 MB
800 : 802 MB
1000 : 1002 MB
1200 : 1066 MB
1400 : 1068 MB
1600 : 1078 MB
1800 : 1113 MB
2000 : 1113 MB
Linux immer die Sachen aus dem Speicher bis etwa 1 GB lesen schieben wurde. Danach begann es, den Prozess selbst unter Druck zu setzen (da die anderen 50% des Speichers durch die anderen Prozesse aktiv waren) und stabilisierte sich bis zum Ende der Datei.
Nun mit madvice():
<[email protected]> ~% ./madvtest file.dat y
0 : 3 MB
200 : 202 MB
400 : 402 MB
600 : 494 MB
800 : 501 MB
1000 : 518 MB
1200 : 530 MB
1400 : 530 MB
1600 : 530 MB
1800 : 595 MB
2000 : 788 MB
Beachten Sie, dass Linux-Seiten nur auf den Prozess zuzuteilen beschlossen, bis es rund 500 MB erreicht, viel früher als ohne madvice(). Dies ist darauf zurückzuführen, dass die im Speicher befindlichen Seiten danach viel wertvoller waren als die Seiten, die durch diesen Prozess als sequenzieller Zugriff markiert wurden. Es gibt einen Schwellenwert im VMM, der definiert, wann mit dem Löschen alter Seiten aus dem Prozess begonnen werden soll.
Sie fragen sich vielleicht, warum Linux Seiten bis zu 500 MB reserviert hat und nicht viel früher gestoppt hat, da sie als sequenzieller Zugriff markiert wurden. Entweder hatte das System sowieso genügend freie Speicherseiten, oder die anderen residenten Seiten waren zu alt, um sie zu behalten. Zwischen alten Seiten im Speicher, die nicht mehr nützlich zu sein scheinen, und weiteren Seiten, die einem Programm dienen, das jetzt ausführt, wählt Linux die zweite Option.
Auch wenn sie als sequenzieller Zugriff markiert waren, war es nur ein Ratschlag. Die Anwendung möchte möglicherweise immer noch zu diesen Seiten zurückkehren und sie erneut lesen. Oder eine andere Anwendung im System. Der Aufruf von madvice() sagt nur, was die Anwendung selbst macht, Linux berücksichtigt das Gesamtbild.
Es kann oder möglicherweise nicht relevant sein, aber es sollte nützlich sein zu wissen: Verwenden Sie ein 32-Bit- oder 64-Bit-System? Ist Ihnen bewusst, dass Sie 1 GB in einem 32-Bit-System nicht mappen sollten? (Auch wenn Sie ein 64-Bit-System verwenden, können Sie sich um die Portabilität kümmern). – Juliano
Alle Systeme sind 64-Bit (mit 64-Bit-Dateizeiger und Offsets) und ich konnte 40 GB-Dateien erfolgreich zuordnen. Ich habe das Problem aus Gründen der Reproduzierbarkeit auf 1 GB reduziert. – Dave
@Sven. Es gibt Fälle, in denen eine Speicherzuordnung unumgänglich ist, beispielsweise wenn ein Bibliotheksaufruf eine Speicherregion und nicht eine Datei erfordert. Ihr Vorschlag ist also nicht hilfreich und beantwortet die Frage nicht. Zur Antwort, anscheinend auf Linux MMAP_SEQUENTIAL ist ziemlich * kaputt *. Der Vorausleseteil funktioniert, der Seitenwiederherstellungsteil nicht. Und die einzige Möglichkeit, Linux zu empfehlen, dass diese Seiten tatsächlich gute Kandidaten sind, besteht darin, die Region aufzulösen (und sie erneut zuzuordnen). –