假设,假设我想对一个可能非常大的文件执行顺序写入。
如果我 mmap() 一个巨大的区域并在整个区域上使用 madvise(MADV_SEQUENTIAL),那么我可以以相对有效的方式写入内存。我已经开始工作了。
现在,为了在我编写时释放各种操作系统资源,我偶尔会在已写入的小块内存上执行 munmap()。我担心 munmap() 和 msync() 会阻塞我的线程,等待数据物理提交到磁盘。我根本不能放慢我的作家的速度,所以我需要找到另一种方式。
在已经写入的小块内存上使用 madvise(MADV_DONTNEED) 会更好吗?我想告诉操作系统将该内存延迟写入磁盘,而不是阻止我的调用线程。
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.