内存映射文件的实现就是把一个硬盘上的文件直接映射到物理页上,然后再把物理内存映射到进程的虚拟内存中,这样在虚拟内存中读写相当于操作自己的内存一样,可以直接操作文件
好处是操作简单,避免打开文件等复杂操作
所有对文件的操作都有效。当要读写的文件非常大时,内存映射文件的性能比io读写方式性能好
内存映射文件要先得到文件句柄
CreateFileMapping函数第一个参数传入文件句柄,那么它会把一个文件映射到物理页中,要是不传入文件句柄,那么它只分配物理内存
MapViewOfFile函数将物理页与虚拟内存关联,返回当前进程虚拟内存地址
FlushViewOfFile函数用于立即刷新内存,使写入得内存立即生效
内存映射文件可以在多个进程中共享
使用OpenFileMapping来打开文件映射对象,相当于得到了物理内存
再使用MapViewOfFIle映射到本进程的虚拟内存
很多系统DLL使用了内存映射文件供多个进程使用
可以想象当A进程修改了一个DLL,B进程使用DLL的时候会发生什么
当A进程在一个DLL中把一块内存改为int 3断点,按理说使用这个DLL的其他进程执行到这里也会中断,但是为什么没有实现呢
原来是当MapViewOfFile函数的dwDesiredAccess参数设置为FILE_MAP_COPY时,当你修改一段内存的时候,会重新复制一块物理页,所以并不会修改之前文件的内存