2009-07-27 28 views

Antwort

4

Alle Zeiger, die in der mmap'd-Region gespeichert sind, sollten als Offsets von der Basis der mmap-Region ausgeführt werden, nicht als echte Zeiger! Sie erhalten nicht unbedingt die gleiche Basisadresse, wenn Sie die Region beim nächsten Programmlauf mmapieren. (Ich musste Code aufräumen, der falsche Annahmen über die Basisadressenkonstanz der mmap-Region annahm).

3

Vergewissern Sie sich, dass die Dateigröße oder die Speichernutzung nicht eingeschränkt ist. Unter Linux gibt es einen eingebauten Shell-Befehl ulimit. Führen Sie als ulimit -a, um die aktuellen Einstellungen zu sehen.

Flush schreibt in das In-Memory-Array in die Datei mit dem Msync (2) Syscall oder sonst bleiben sie im Speicher bis munmap (2) und es kann zu einem Stromausfall oder etwas davor kommen!

Wenn mehrere Prozesse dieselbe Speicherregion mit Lese- und Schreibberechtigungen teilen, stellen Sie sicher, dass nur jeweils einer in sie schreibt, um eine Beschädigung Ihrer Daten zu vermeiden. Oder verwenden Sie Dateisperrung oder eine andere Art der Synchronisierung.

+0

Spülen ist nicht notwendig, da die Daten konstant sind. –

3

Dies ist der einfachste Anwendungsfall für mmap(), also sollte es nicht viel geben, um Sie zu stolpern.

Sie laden gerade ein großes konstantes Array. Da es sich um Konstanten handelt, sollten Sie sich keine Gedanken über die Synchronisation machen. Es wäre ratsam, sicherzustellen, dass der Parameter prot nur auf PROT_READ gesetzt ist, da Sie nicht schreiben werden.

Wenn ein oder mehrere Programme, die die Konstanten verwenden, kontinuierlich ausgeführt werden, kann es sinnvoll sein, ein separates Programm zu haben, das die Daten lädt und resident hält. Läufe der anderen Programme machen dann im Wesentlichen nur einen Shared-Memory-Attach, anstatt die Datei ständig in den Speicher zu lesen.