仮説として、非常に大きな可能性のあるファイルに順次書き込みを実行したいとします。
巨大な領域を mmap() し、その領域全体で madvise(MADV_SEQUENTIAL) を実行すると、比較的効率的な方法でメモリに書き込むことができます。これで問題なく動作するようになりました。
現在、執筆中にさまざまな OS リソースを解放するために、既に書き込まれているメモリの小さなチャンクに対して munmap() を実行することがあります。私の懸念は、データがディスクに物理的にコミットされるのを待って、munmap() と msync() が私のスレッドをブロックすることです。ライターの速度をまったく落とすことができないので、別の方法を見つける必要があります。
既に書き込まれた小さなメモリ チャンクに対して madvise(MADV_DONTNEED) を使用する方が良いでしょうか? そのメモリを遅延してディスクに書き込み、呼び出し元のスレッドをブロックしないように OS に指示したいと考えています。
madvise() のマンページには次のように書かれていますが、これはかなりあいまいです。
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.