如果我在内存映射区域上使用MS_ASYNC调用msync,则同步过程将异步处理。

但是,如果我立即在该区域上调用munmap,是否可以假定msync将被安全执行?还是我必须在munmap之前致电msync?

最佳答案

简短的答案是肯定的-即使您从不调用msync,对内容的更改最终也会(并且安全地)进入文件。从man 2 mmap:

MAP_SHARED
          Share this mapping.  Updates to the mapping are visible to other
          processes that map this file, and are carried through to the
          underlying file.  (To precisely control when updates are carried
          through to the underlying file requires the use of msync(2).)

也许更重要的是,man 2 msync具有以下注释:

从Linux 2.6.19开始,MS_ASYNC实际上是禁止操作的,因为内核会正确跟踪脏页并将其刷新到必要的存储位置。

请记住:mmap直接将文件系统高速缓存的页面公开给用户空间,就像其他任何高速缓存系统一样,更改将在将来的某个时刻传播到后备存储。即使您的程序崩溃,对页面所做的更改最终仍会传播。 msync的使用是为了保护您免受断电之类的伤害。

10-04 19:57