如果我在内存映射区域上使用MS_ASYNC调用msync,则将异步处理同步过程。
但是,如果我立即在该区域调用munmap,我可以假设msync将安全执行吗?或者我必须在munmap之前调用msync吗?
答案 0 :(得分:1)
简短回答是肯定的 - 即使您从不呼叫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
的使用是为了保护您免受断电等事情的影响。