关于内存映射文件之前在操作系统的课本上学过,不过并为引起关注,当然也不很理解。由于有时候在研究mongodb,看到mongodb的一个关键特性就是利用了内存映射文件这一特性,但是关于它所宣称的那一系列的高效率的原因不是很理解。所以决定好好的研究一下内存映射文件。
关于内存映射文件我找了很多资料,包括课本,网络,但是发现好像说的都不是那么清楚,尤其是网络上的好多博文写的内容大都包含一些值得推敲的地方甚至是错误的地方,这无疑给我理解造成了更多的混乱。下面我用简单的语言把把内存映射文件这一技术总结一下:
1,内存映射文件表面上来说就是一种把内存和磁盘上的文件进行映射的一种技术;
2,上面所提到的内存并不是真正的物理内存,而是操作系统中的虚拟内存;
3,映射的大概过程为把虚拟内存中的一个地址对应于磁盘文件中的一个地址,通过指针移到来实现快速寻址;
4,受限于虚拟内存的大小也就是操作系统分配给进程的内存大小为2的32次方(32位操作系统)或是是64位的,那么在32位的系统上能够映射的文件大小肯定是小于4G的,实际上根据操作系统的不同,大概也就只能映射大概2G的大小;
5,通过内存映射文件读写文件通过减少数据复制次数来达到提高性能的目的。即在进行一般的文件操作时,操作系统先将数据读进操作系统的内核缓冲去,再将数据复制到应用程序的进程空间中,写操作反之;而利用内存映射文件就省去了数据在操作系统的内核缓冲器中转的这一个步骤,从而来提高效率。
6,内存映射文件这种技术的适用场景,关于这个问题我还没有深入的实验研究,但是我想引用一片文章的说法,因为我通过整理考证了各种资料后觉得这篇文章很不错,应该值得相信。http://www.360doc.com/content/11/0225/10/61151_95939141.shtml
该文章中的这一部分为英文,我还是翻译一下吧:
适用的场景:
(1)一个需要随机访问一次或者是多次的大文件;
(2)一个需要立刻读入内存并且需要频繁访问的小文件;
(3)需要在内存中缓存文件中特殊的一部分。
不适用的场景:
(1)一个需要顺序的从文件头到文件尾只读一次的文件;
(2)一个几百兆的甚至更大的文件,因为你的应用程序的进程的进程的内存空间可能不足。