一、内存映射文件的概述
内存映射文件:就是将磁盘上的文件全部或者部分映射到物理内存的一块地址空间,通过这个地址空间,应用程序就可以象访问内存一样来访问这个磁盘文件。
通常情况下,文件的操作要通过打开,读取,处理,关闭这样的步骤,要使用AssignFile,Rewriter,Reset,Write,Read等等这些函数,过程比较繁琐。并且需要自己来处理文件的缓存,这也是一个相当麻烦的过程。
通过把磁盘文件映射到虚拟内存地址空间,并得到指向该区域的指针,通过这个指针对文件进行操作。这样,在避免使用I/O操作来处理文件的同时,由操作系统来处理文件的缓存,缓冲,写入,调入,内存的分配和释放,极大的简化了对文件的访问,提高了效率,尤其是频繁对大文件处理时的更是如此。
因此,对于内存映射文件的使用,主要是有两大好处,一是简化操作,二是提高效率。
二、内存映射文件在软件开发中的应用。
1、用来调入和运行EXE和DLL文件,节省页交换的空间,加快程序运行的速度。
2、以指针的形式对映射文件的数据进行处理,简化操作,提高效率。
3、在同一台计算机上,利用内存映射文件实现多个进程共享数据
1主要是用于系统软件的开发,2和3在应用级软件开发方面用的比较多。
三、内存映射文件的使用
1、用FileCreate创建文件,或者用FileOpen打开文件,取得这个文件的句柄。
具体到FileOpen,文件的访问模式分为:fmOpenRead,fmOpenWrite,fmOpenReadWrite,也可以是0,0代表既不能读,也不能写。如果要在不同程序间共享数据,则要把文件的访问模式和共享模式结合起来。
文件的共享模式分为:
fmShareCompat,这个模式已经过时,
fmShareExclusive 不允许共享
fmShareDenyWrite 不允许别人以fmOpenWrite模式打开
fmShareDenyRead 不允许别人以fmOpenRead模式打开
fmShareDenyNone 允许别人以任何模式打开,Deny是禁止的意思。
2、用CreateFileMapping创建文件映射对象,该函数具有6个参数
第一个是THandle类型的,将要映射的文件的句柄,从FileCreate或者FileOpen得来。
第二个是指向TSeucrityAttributes结构指针的内存映射对象的安全属性,通常设为nil
第三个是文件视图的保护类型,分为以下3种保护类型
PAGE_READONLY 对应的文件以fmOpenRead模式打开
PAGE_READWRITE 对应的文件以fmOpenReadWrite模式打开
PAGE_WRITECOPY 对应的文件以fmOpenWrite或fmOpenReadWrite模式打开,这种类型下,会复制修改过后的内存页面。
第四个是文件映射对象最大尺寸的高32位值,如果文件小于4G,该值为0
第五个是文件映射对象最大尺寸的低32位值,该值为0的话,表示映射对象最大尺寸等于文件大小
第六个是文件映射对象的名称
该函数调用成功,返回文件映射对象的句柄,失败则返回0,这个函数的作用,本质上说,就是告诉操作系统,要映射哪个文件,文件的大小是多少。
除此之外,也可以用OpenFileMapping函数来打开一个文件映射对象。
3、用MapViewOfFile把文件视图映射到进程的地址空间,该函数具有5个参数
第一个是文件映射对象的句柄
第二个是文件视图访问模式,分为四种模式
FILE_MAP_WRITE 对应PAGE_READ_WRITE
FILE_MAP_READ 无限制
FILE_MAP_ALL_ACCESS 对应PAGE_READ_WRITE
FILE_MAP_COPY 允许文件写入的同时进行复制,无限制
第三个是文件映射起始位置偏移量的高32位
第四个是文件映射起始位置偏移量的低32位
第五个是要映射的字节数,0表示映射全部文件
该函数调用成功,返回文件视图的起始地址。调用失败则返回nil。这个函数,从本质上说,就是告诉操作系统,把文件映射到哪里,映射多少个字节。
4、用UnmapViewOfFile解除文件视图与进程地址空间的映射关系
完成文件处理后,应当马上UnmapViewOfFile,释放映射区域内存。这个函数只需要一个参数,就是就是MapViewOfFile函数的返回值
5、用CloseHandle关闭文件句柄和文件映射对象句柄,调用成功返回True,失败返回False。