《Windows核心编程》读书心得——内存(内存映射文件)(5)

来源:互联网 发布:程序员项目总结怎么写 编辑:程序博客网 时间:2024/04/30 02:52

内存映射文件:前面提到,硬盘上的物理存储器大部分是以页交换页面的形式存在。除此之外,其实硬盘上的内存还可以通过内存映射文件的方式来分配。

 它的物理存储器来自磁盘上已有的文件,而不是系统的页交换文件。

优点:

(1)直接使用磁盘上的文件本身作为物理存储器(例如:exe、dll),而不用页交换文件,能够有效节省空间;

(2)节省了应用程序启动的时间;

(3)同一应用程序的多个实例可以共享内存中的代码和数据(当一个程序已经运行,那么再打开一个程序的实例,只不过是创建一个新的内存映射视图,不会分配新的空间);

疑问:既然是共享内存,那么怎么保证每个程序实例的数据和代码的独立性?

系统是通过“写时复制”的方法来保证这种独立性的。不同的视图映射到相同的内存地址,但是,当程序视图对内存映射文件执行“写入”操作时,系统会为需要写入的页面分配新的页面,然后将原来的页面数据拷贝到新页面,这样就能够保证程序在新的页面上修改数据,而不影响到其它视图对应页面中的内容。

内存映射文件的使用步骤:

(1)创建或打开一个文件内核对象,该对象标识了我们想要用作内存映射文件的那个磁盘文件;

CreateFile()函数。

最好传0给dwShareMode参数,告诉系统想要独占对文件的访问。

(2)创建一个内存映射内核对象,告诉系统文件的大小及如何访问文件;

CreateFileMapping()函数。

(3)告诉系统把文件映射对象的部分或全部映射到进程的地址空间中。

文件被映射到进程地址空间中的部分,被称为视图。

系统保证同一个内存映射对象的多个视图是一致的,但不保证不同内存映射对象的视图是一致的。

MapViewOfFile()函数(需要告诉系统,把数据文件的哪个字节映射到视图的第一个字节,以及把数据文件的多少个字节映射到地址空间中去)。

内存映射文件的清理过程:

(1)告诉系统从进程地址空间中取消对文件映射内核对象的映射;

UnmapViewOfFile()函数。

如果需要确保所作的修改被写回磁盘中,可调用FlushViewOfFile()函数。

(2)关闭文件映射内核对象;

CloseHandle()函数。

(3)关闭文件内核对象。

CloseHandle()函数。

原创粉丝点击