文章目录
- 前言
- 一、映射到内存的可执行文件和DLL
- 二、映射到内存的数据文件
- 三、使用内存映射文件
- 四、用内存映射文件来处理大文件
- 五、内存映射文件和一致性
- 六、给内存映射文件的指定基地址
- 七、内存映射文件的实现细节
- 八、用内存映射文件再进程间共享数据
- 九、以页交换文件为后背存储器的内存映射文件
- 十、 稀疏调拨的内存映射文件
前言
内存映射文件 与虚拟内存相似,内存映射文件允许开发人员预定一块地址空间区域并给区域调拨物理存储器。不同之处在于内存映射文件的物理存储器来自磁盘上已有的文件,而不 是来自系统的页交换文件。 一旦把文件映射到地址空间,我们就可以对它进行访问,就好像整个文件都已经在被载入内存一样。
页交换文件,简单讲就是系统用于做虚拟内存的一个磁盘文件
页交换文件相关可参考windows内存体系结构
内存映射主要用于以下三种情况:
- 系统使用内存映射文件来载入并运行.exe和动态链接库(DLL)。这大量节省了页交换文件的空间以及应用程序启动的时间。
- 开发人员可以使用内存映射文件来访问磁盘上的数据文件。这使得我们可以避免直接对文件进行I/O操作和对文件内容进行缓存。
- 通过使用内存映射文件,我们可以在同一台机器的不同进程间共享数据。Windows的确提供了其它一些方法来在进程间传送数据,但这些方法都是通过内存映射文件来实现的。因此,如果在同一台机器的不同进程之间共享数据,内存映射文件时最高效的方法。
一、映射到内存的可执行文件和DLL
CreateProcess调用过程
当一个线程在调用CreateProcess的时候,系统会执行以下步骤:
- 系统会先确定CreateProcess所指定的可执行文件所在的位置。如果无法找到该.exe文件,那么系统将不会创建进程,这时CreateProcess会返回FALSE.
- 系统创建一个新的进程内核对象。
- 系统为新进程创建一个私有地址空间。
- 系统预定一块足够大的地址空间来容纳.exe。待预定的地址空间区域的具体位置已经在.exe文件中指定。 默认情况下,.exe文件的基地址是0x00400000。但是,只需在构建应用程序的.exe文件时使用/BASE连接器开关,我们就可以给自己的应用程序指定一个不同的地址。
- 系统会对地址空间区域进行标注,表明该区域的后备物理存储器来自磁盘上的.exe文件,而并非来自系统的页交换文件。