mmap基本概念
正常文件读写的操作一般是先去页缓存里读文件内容,拿到之后进行想要的操作,然后再写入页缓存里面就可以了,而页缓存与文件相关联,对文件进行读写操作都要经过页缓存。而在读写的过程中,因为页缓存在内核态里,就会有从页缓存读和写入页缓存这两次用户态和内核态的转变和拷贝数据。那么如果可以在用户态去操作页缓存,就可以避免多次拷贝数据,这个时候就是靠mmap来操作了。
文件读写操作
MMAP主要是将用户空间与页缓存进行内存映射,进程对内存进行修改后系统会自动把数据写到对应的页缓存中,然后在恰当的时机就会写进磁盘中,也可以主动调用函数来写入磁盘中。磁盘对文件的修改也会反映到用户内存中。
内存映射的过程
内存映射主要做了三个步骤
- 首先要映射就要在虚拟空间建立相应的映射地址
- 对这个虚拟地址进行映射的操作,这样子就与文件相对应了。
- 最后一步则是通过进程来访问对应的虚拟空间,因为此时只有地址映射,实际没有数据拷贝,内存还没有任何数据,所以会发生缺页中断,这个时候会去查询页缓存有没有这个文件,没有的话再去磁盘中加载到页缓存,再指向页缓存实现映射。
内存映射的优缺点
优点
- 可以减少用户态和内核态的转换,提高效率
- 可以实现跨进程共享内存,比如当进程a和b都指向同一个虚拟地址的时候,a进行的操作也会反映到b上面,同时因为a进行了读或写的操作,b读写的时候虽然也会发生缺页中断,但是可以直接从页缓存读,不用再去加载磁盘。
缺点
- mmap是有可能会丢失数据的,如果用户没有调用相关函数去主动进行磁盘与页缓存数据同步,那么系统进行同步通知的时机就只有进程退出和系统关机这两个时机,碰上手机断电这些特殊时候会丢失数据。
参考资料:
一文读懂 mmap 原理
认真分析mmap