Hypothetisch angenommen, ich möchte das sequentielle Schreiben in eine potenziell sehr große Datei ausführen.Weist madvise (___, ___, MADV_DONTNEED) das Betriebssystem an, auf Festplatte zu schreiben?
Wenn ich eine riesige Region (madv_SEQUENTIAL) auf diese gesamte Region mmap(), dann kann ich in den Speicher in einer relativ effizienten Weise schreiben. Das habe ich gut gemacht.
Jetzt, um verschiedene OS-Ressourcen freizugeben, während ich schreibe, führe ich gelegentlich eine munmap() auf kleine Teile des Speichers, die bereits geschrieben wurden. Meine Sorge ist, dass munmap() und msync() meinen Thread blockieren und darauf warten, dass die Daten physisch auf die Festplatte übertragen werden. Ich kann meinen Autor überhaupt nicht verlangsamen, also muss ich einen anderen Weg finden.
Wäre es besser, madvise (MADV_DONTNEED) auf dem kleinen, bereits beschriebenen Speicherbereich zu verwenden? Ich möchte dem Betriebssystem mitteilen, dass es diesen Speicher langsam auf die Festplatte schreiben soll, und nicht, um meinen aufrufenden Thread zu blockieren.
Die manpage auf madvise() hat dies zu sagen, welche eher zweideutig ist:
MADV_DONTNEED
Do not expect access in the near future. (For the time being, the
application is finished with the given range, so the kernel can free
resources associated with it.) Subsequent accesses of pages in this
range will succeed, but will result either in re-loading of the memory
contents from the underlying mapped file (see mmap(2)) or
zero-fill-on-demand pages for mappings without an underlying file.
Ich würde das nicht versuchen; 'MADV_DONTNEED' für eine Dateizuordnung kann so interpretiert werden, dass das Betriebssystem * Änderungen an der Datei * wegschmeißen soll. – zwol
@Zack, haben Sie eine Referenz für MADV_DONTNEED Verwerfen von Änderungen in einer Datei? – Anton
@antonm http://man7.org/tlpi/code/online/dist/vmem/madvise_dontneed.c.html hat ein Programm, das es demonstriert (nicht in sich abgeschlossen, leider, aber einfach genug zu modifizieren). Siehe auch https://www.gnu.org/software/libc/manual/html_node/Memory_002dmapped-I_002fO.html ("' MADV_DONTNEED': Die Region wird nicht mehr benötigt. Der Kernel kann diese Seiten freigeben, * wodurch sich Änderungen ergeben die Seiten verloren gehen * "(Hervorhebung meins)) und dieser LKML-Thread von 2005: https://lkml.org/lkml/2005/6/28/188. – zwol