Mmap können Sie in gewisser Weise helfen, ich mit einigen hypothetischen Beispiele erläutern werde:
Das erste, was: Lassen Sie uns sagen, dass Sie nicht genügend Arbeitsspeicher laufen lassen, und Ihre Anwendung, die eine 100MB Batzen malloc'ed haben Speicher 50% davon ausgelagert, das bedeutet, dass das OS 50MB in die Auslagerungsdatei schreiben musste, und wenn Sie es zurücklesen müssen, haben Sie 50MB Ihrer Auslagerungsdatei geschrieben, belegt und dann wieder eingelesen.
Wenn der Speicher nur mmapiert wurde, wird das Betriebssystem diese Information nicht in die Auslagerungsdatei schreiben (da es weiß, dass diese Daten mit der Datei identisch sind), stattdessen werden nur 50MB gelöscht Information (wiederum: Angenommen du hast noch nichts geschrieben) und das war's. Wenn Sie diesen Speicher zum erneuten Lesen benötigen, holt das Betriebssystem den Inhalt nicht aus der Auslagerungsdatei, sondern aus der ursprünglichen Datei, die Sie mma- piert haben. Wenn also ein anderes Programm 50 MB Auslagerung benötigt, sind diese verfügbar. Außerdem gibt es keinen Overhead mit Swapfile-Manipulation.
Nehmen wir an, Sie lesen einen 100MB Datenblock, und entsprechend den ersten 1MB Headerdaten befindet sich die gewünschte Information bei Offset 75MB, Sie brauchen also nichts zwischen 1 ~ 74.9MB! Sie haben es nur gelesen, um Ihren Code zu vereinfachen. Mit mmap werden Sie nur die Daten lesen, auf die Sie tatsächlich zugegriffen haben (abgerundete 4 KB, oder die OS-Seitengröße, die meistens 4 KB beträgt), sodass nur das erste und das 75. MB gelesen werden. Ich denke, es ist sehr schwierig, einen einfacheren und effektiveren Weg zu finden, Disk-Lesen zu vermeiden als mmap-Dateien. Und wenn Sie aus irgendeinem Grund die Daten bei Offset 37MB benötigen, können Sie es einfach verwenden! Sie müssen es nicht erneut mappen, da die gesamte Datei im Speicher verfügbar ist (natürlich begrenzt durch den Speicherplatz Ihres Prozesses).
Alle gemappten Dateien werden von sich selbst gesichert, nicht von der Auslagerungsdatei. Die Auslagerungsdatei wird erstellt, um Daten zu gewähren, die keine zu sichernde Datei haben. Dies sind normalerweise Daten mallokkiert oder Daten, die gesichert werden durch eine Datei, aber es wurde geändert und [kann/soll nicht] zurückgeschrieben werden, bevor das Programm dem Betriebssystem tatsächlich sagt, dies über einen msync-Aufruf zu tun.
Beachten Sie, dass Sie nicht die gesamte Datei im Speicher abbilden müssen, Sie können jede Menge (2. arg ist "size_t length") ab einer beliebigen Stelle abbilden (6. arg - "off_t offset"), aber es sei denn Ihre Datei ist wahrscheinlich enorm, Sie können sicher 1 GB Daten ohne Angst zuordnen, auch wenn das System nur 64 MB physischen Speicher packt, aber das ist zum Lesen, wenn Sie planen zu schreiben, dann sollten Sie konservativer sein und nur die Karte Sachen, die du brauchst.
Mapping-Dateien helfen Ihnen, Ihren Code einfacher zu machen (Sie haben bereits den Dateiinhalt im Speicher, gebrauchsfertig, mit viel weniger Overhead, da es kein anonymer Speicher ist) und schneller (Sie werden nur die Daten lesen, die Sie benötigen) Programm zugegriffen).
Wie groß ist 'groß'? Am wichtigsten ist, wie vergleicht es sich mit dem gesamten realen RAM auf dem Computer, wo dies laufen wird? – zwol
Big ist mehrere Gigabyte. Ich habe 24G RAM, so dass einige Dateien so viel wie ein Viertel des physischen RAM oder sogar mehr belegen können. – Elektito
Mit 'mmap()' verursachen Sie im Grunde, dass der Speicher durch eine Datei gesichert wird, anstatt durch Swap gesichert zu werden (sogenannter anonymer Speicher). Unter dem Druck des Speichers kann der Kernel beschließen, dateiunterstützten Speicher aggressiver als anonymer Speicher zurückzufordern, oder er kann das Gegenteil tun, ich weiß es nicht. – ninjalj