从 /proc/[pid]/maps 可以看到,程序的数据段会被映射为一个单独的区间,而且是可读写的。因而自然有这样的疑惑:
当修改一个全局数据的时候,会影响到程序的 image 文件么?答案肯定是不会,那么这种映射和将一个普通的文件映射到内存中,而且希望通过操作内存来改动这个文件,有什么区别?
这就是文件内存映射的两种方式:共享和私有
当以 share 的方式映射一个文件时,对内存的操作就会同步到文件中,所以,对普通文件的映射,以这种方式进行。
而以 private 的方式映射文件时,对内存的写操作会导致一次 COW 操作,写操作会导致产生新的页面,改动在新的页面中,而不会影响到磁盘上的文件。所以,对数据段的映射以这种方式进行。
几个问题:
1、 当映射时,是否文件中的所有数据都加载到内存中?
不是!只有当真正需要此页面时,产生缺页异常,才将页面载入内存
2、 对内存的写操作,是否立刻同步到文件中?
不是!内核线程 bdflush 周期性的运行,发现页面“脏”,才写回磁盘
3、 对于共享的映射来说,如果文件内容发生了变化,页面会得到同步么?
会!应该是在文件写操作的时候,会将数据同步到所关联的页面中