mmap是一种内存映射文件的方法,即将一个文件或者其它对象映射到进程的地址空间,实现文件磁盘地址和进程虚拟地址空间中一段虚拟地址的一一对映关系。实现这样的映射关系后,进程就可以采用指针的方式读写操作这一段内存,而系统会自动回写脏页面到对应的文件磁盘上,即完成了对文件的操作而不必再调用read,write等系统调用函数。相反,内核空间对这段区域的修改也直接反映用户空间,从而可以实现不同进程间的文件共享。
mmap较之于系统read/write来说有着速度上的优势,具体原因是为何,我们来探究一下。
一、基础知识
1. 虚拟内存
对于计算机程序来说,当该程序需要运行时,需要把该程序相关的代码、数据等信息全部装入内存中。在早期的计算机中,是没有虚拟内存说法的,这样就会造成以下一些问题:
1) 各个进程间地址不隔离,无法做到权限保护
由于所有进程的信息都直接装入内存中,所有进程都可以对内存进行访问,在该过程中,一个进程就可以访问到其他进程在内存中的数据,同时其他进程也可以访问到该进程在内存中的数据。这种情况下无法保证程序的数据安全。
2) 内存使用效率低
当切换至新的进程时,如果内存不足,需要将其他进程的信息全部拷贝到硬盘中,然后再将新进程的内容拷贝到内存中。如果进程过多,那么会造成大量的数据在内存中的装入装出,使得内存使用效率低下。
3) 程序运行地址不确定
由于每次装入进程数据都是随机的,所以对于程序来说,运行的地址是不确定的。
由于上面一系列缺点,进而引进了虚拟内存
的概念:
系统会为每一个进程创建相等的内存空间(对于32位系统,寻址地址为4字节,对应空间大小为4G)。
注意:该内存空间是虚拟假设的,而不是实际存在的。
同时系统将该内存空间分为两部分:内核空间
、用户空间
。如图:
这样,对于进程来说,它能访问的内存空间就只有属于它的虚拟地址,同时对于进程来说,每次运行的地址都是确定的。至于内存使用效率,则交给操作系统去处理以及优化。
2. 虚拟内存的工作原理
当然,对于进程来说,要实实在在的跑起来,不能照着虚拟内存对着空气运行,必须运行在实际的物理内存上,那么如何由虚拟内存对应至物理内存呢?
页
在现代操作系统中,对内存操作的最小基本单位为页
:虚拟内存被分为多个相等大小的虚拟页,物理内存也被分为多个相等大小的物理页,且虚拟页与物理页也保持相等,通常大小都为4KB。
对应关系
虚拟页需要与物理页进行一一映射,确认映射关系后,操作系统将虚拟页所需数据缓存到物理页中。根据该原理,虚拟页存在以下三种状态:
- 未映射:该虚拟页在实体物理内存中没有对应映射。
- 未缓存:该虚拟页在实体物理内存中有对应的物理页一一映射,但是操作系统还未将物