Jeffrey Richter对Memory-Mapping File已经讲述的很详细了,现在我们可以归纳以下:
一、功能
1. 简化对数据文件的操作。(利用内存映射文件,Windows将会负责文件数据在RAM的缓存及其和磁盘的数据交换,消除了我们很多麻烦)
2. 进程间共享数据和通讯。(主要是创建一个Memory-Mapping File对象,这个Memory-Mapping File对象使用INVALID_HANDLE_VALUE来模拟创建一个由Page File而不是硬盘上数据文件所支持的对象,然后在多个进程间共享这个对象(3种方法),然后利用更新同样的RAM数据来实现同步更新,及其通讯)
3. 理解操作系统的Loader机理。(OS Loader也是调用CreateFile,
CreateFileMapping及其MapViewOfFileEx 来加载一个.exe文件)
二、使用
CreateFile: Calling
CreateFile tells the operating system the location of the file mapping's physical storage.
CreateFileMapping: Create a file-mapping kernel object that tells the system (1) the size of the file and (2) how you intend to access the file.(When you create a file-mapping object, the system does not reserve a region of address space and map the file's storage to the region)。如果此函数所指定的大小比硬盘上的文件大的话,文件将会扩展为此函数所指定的大小。
MapViewOfFileEx: reserve a region of address space for the file's data and commit the file's data as the
physical storage that is mapped to the region。(note: if we do not touch much of the view, windows virtual memory manager will not page the
physical storage into RAM)
三、实现细节
CreateFile函数将一个hFile对象与磁盘上的一个文件对应起来
CreateFileMapping将会将此hFile对应的磁盘文件映射到到一组RAM页面,不过并不为其保留进程的虚拟地址空间,也不为其提交内存?(它还没有被分配虚拟内存地址,所以根本不能被访问)
MapViewOfFile将前面创建的FileMapping对象映射进进程的虚拟地址空间,并且提交内存。
由上面可以看到,相同的FileMapping对象代表着相同的RAM页面,所以对于同一个FileMapping对象的不同View修改会造成同一块内存页面被多次修改。
Tip:
1. CreateFileMapping在已经有一个FileMapping存在的情况下返回值并不是NULL,而返回现在已经存在的FileMapping的句柄
GetLastError returns ERROR_ALREADY_EXISTS,所以一定要看文档。
转载于:https://www.cnblogs.com/jeffreytan/archive/2005/02/01/100273.html