(转)内存映射文件分析

来源:互联网 发布:电脑软件管家排行榜 编辑:程序博客网 时间:2024/05/22 17:31

内存映射文件提供了一个统一的内存管理特征,使得应用程序能够通过内存指针象访问动态内存一样对磁盘上的文件进行访问。通过内存映射文件,您可以将磁盘上文件的全部和部分映射为一个视图到进程虚拟地址空间的某个位置。一旦完成了映射视图,对文件内容的访问就如同在该地址区域内直接对指针取值一样简单。这样,向文件中写入数据就可以直接对指针进行赋值,如:

*pMem = 23;

同样,从文件的某个特定位置读取数据也一样非常的简单:

nTokenLen = *pMem;

在这个例子中,指针pMem 代表映射到文件视图的进程地址空间的某个区域中任何一个地址。事实上,当内存映射文件提供了对文件某个特定位置的直接读写时,真正的对磁盘文件的读写是由底层处理的。而且,数据也并非在每次操作时都即时写入到磁盘,而是大量的文件I/ O通过缓冲处理来提高系统的整体性能。当然,您可以通过调用内存映射文件函数FlushViewOfFile强制立即执行磁盘事务处理以重载这种缓冲处理方式。

内存映射文件给开发者提供了那些优势?

使用内存映射文件I/O的一个好处是系统对所有的数据的传输都是通过4K的数据页面来实现的。内部的所有内存页面都是有虚拟内存管理器来管理的,它决定内存的页面何时被分页对应到磁盘,哪些页面应被释放以提供给其它的应用程序使用,以及每个应用程序可以拥有超出实际分配的物理内存之外多少个页面空间。因为虚拟内存管理器以统一的方式处理所有磁盘I/O——一次以一个页面为单位读写内存,这种优化使它能够以足够快的速度处理内存操作。限制所有的磁盘的读写操作以4K大小的页面为单位进行,意味着一些小的I/O操作将被缓冲入一次大的操作之中,也就是说一次I/O操作以后的其它操作所需的数据已经被前一次的页面操作读入到内存,从而无需再进行一次磁盘I/O,这样将大幅度地减少硬盘读写头的移动,从而提高了系统的性能。一次以一个页面读写内存有时也称为内存分页。

使用内存映射文件的另一个好处是所有的实际I/O交互现在都发生在RAM中并以标准的内存地址形式来访问。同时,磁盘的周期性分页发生在后台由操作系统本身实现,对应用程序是完全透明的。虽然用内存映射文件如果只是将文件读入内存在性能上没有什么提高,但以后的磁盘事务操作将会从中极大地获益。例如,对按记录结构组织的数据库文件,它可能有成上千条连续的记录,访问该文件中的某条记录也只是定位该记录在文件中的位置,并将其读入内存结构。每一次的更新,记录都必须写入文件以保存更新后的信息。这时,对于大记录,有时候一次只读取该记录所需处理的一部分是很有必要的。但是,这种情况又将导致读取记录其它部分时又需进行一次文件操作。而内存映射文件实现这种工作与上述的方式是不同的,当该记录第一次被访问时,包括该记录的整一个4K的页面一次被读入到内存,后续的对该记录的访问只要在此4k页面内,都将是对内存中该页面的直接操作进行处理,而不再需要另外的磁盘I/O操作,直到该文件被关闭或强制刷新。

在系统的正常的分页操作过程中,内存映射文件将被定期地更新。如果系统需要使用已被某个内存映射文件占用的页面时,它可以释放该页面以供其它应用程序使用。若该页面在此时为脏页面,将数据写入磁盘的操作将会自动由系统完成。