虚拟内存与内存映射文件是操作系统内存管理的重要部分,二者有相似也有不同的地方,本文是作者学习与应用中得到的一些体会,有错误的地方,请提点。
二者的联系:虚拟内存与内存映射文件都是将一部分内容加载的内存,另一部分放在磁盘(硬盘)上的一种机制。二者都是应用程序动态性的基础。由于二者的虚拟性,对于应用而言,都是透明的。
学过操作系统的都知道虚拟内存其实就是磁盘的一部分,是计算机RAM与硬盘的数据交换区。因为实际的物理内存可能远小于进程的地址空间,这就需要把内存中暂时不用到的数据放到硬盘上一个特殊的地方,当请求的数据不在内存中时,系统产生却页中断,内存管理器便将对应的内存页重新从硬盘调入物理内存。在Windows系统,硬盘中这部分空间是一个文件,即系统目录下的pagefile文件。
内存映射文件是由一个文件到一块内存的映射,使应用程序可以通过内存指针对磁盘上的文件进行访问,其过程就如同对加载了文件的内存的访问,因此内存文件映射非常适合于用来管理大文件。
虚拟内存实现的硬件基础是分页机制,关于分页机制本文再此不做介绍。linux系统的虚拟内存在磁盘中有指定的一块区域作为虚拟内存区即SWAP,如果磁盘没有该区就不能实现虚拟内存。虚拟内存实现的另外一个重要基础是局部性原理。局部性是指程序总是趋向于使用最近使用过的数据和指令,也就是说程序执行时所访问的存储器地址分布是相对集中的。局部性原理是应用虚拟内存提升性能的主要原因,也是虚拟内存却别与内存映射文件的本质。内存映射文件虚拟性并不是由于局部性,而是使进程虚拟地址空间的某个区域建立映射磁盘文件的全部或部分内容,通过该区域可以直接对被映射的磁盘文件进行访问,而不必执行文件I/O操作也无需对文件内容进行缓冲处理。
另外,虚拟内存使用硬盘只能是页面文件,而内存映射使用的磁盘部分可以是任何磁盘文件。
最后,二者的架构不同,或者说是应用出发点不同。虚拟内存是架构在物理内存之上,其引入是因为实际的物理内存运行程序所需的空间,即使现在计算机中的物理内存越来越大,程序的尺寸也在增长。将所有运行着的程序全部加载到内存中不经济也非常不现实。内存映射文件架构在程序的地址空间之上,在Win32中,地址空间只有4G,而某些大文件的尺寸可要要远超出这个值,因此,用地址空间中的某段应用文件中的一部分可解决处理大文件的问题,在Win32中,使用内存映射文件可以处理2的64次(64EB)大小的文件.原因内存映射文件,除了处理大文件,还可用作进程间通信,在此不做详解。
转自:http://blog.sina.com.cn/s/blog_4eee98350100abbr.html