一般来说,应用程序对文件的操作分为两类:第一类是操作文件本身,包括new、delete、cut、copy、paste以及获取或修改文件属性等操作;第二类就是操作文件的内容,包括:read、write以及文件指针,事实上,cut、copy和paste从实现上来说,也是文件内容操作。对于第二类操作,通行的做法是设计一个buffer(它对应进程地址空间的一个区域),先把待操作的内容读入到buffer,然后操作buffer(比如使用字符串处理函数),最后将有效的内存从buffer写入文件。但是,在操作大文件的时候,这种buffer设计的效率就比较低了。为此,Windows提供了一种更高效的处理大文件的机制——“内存映射文件”。
内存映射文件的实际就是,将磁盘上的文件直接映射到进程地址空间。与虚拟内存相似,内存映射文件运行开发人员预订一块地址空间区域并给区域调拨物理存储器。不同的是,内存映射文件的物理存储器来自磁盘上已有的文件,而不是来自系统的pagefile。一当把文件映射到地址空间,我们就可以对它进行访问,就好像整个文件都已被载入内存了一样。
内存映射文件主要用于以下三种情况:
1)系统使用内存映射文件载入并 运行.exe和动态链接库.dll文件。这大量节省了系统的pagefile空间以及应用程序启动的时间。
2)开发人员可以用内存映射文件来访问磁盘上的数据文件。这使得我们可以避免直接对文件进行IO操作和对文件进行缓存。
3)通过使用内存映射文件,我们可以在同一台机器的不同进程之间共享数据。Windows提供的其他进程间传输数据的方法,都是通过内存映射文件来实现的,故内存映射文件共享数据的效率最高。
一、exe或dll文件映射到地址空间
当用户在Windows中双机一个*.exe,文件管理器会调用“CreateProcess”(该函数需要传入“*.exe”字符串作为参数),然后