Windows核心编程 - 内存映射文件(3)

1. 用内存映射文件来处理大文件

    方法就是只映射文件的一个视图,这个视图只包含文件的一小部分数据。比如一开始时,把文件开关的部分映射到视图中,完成对视图的访问后,撤销这一部分的映射,再把文件的另一部分映射到视图,重复此过程,直至完成对整个文件的访问。

2.内存映射文件和一致性

      系统允许把同一个文件中的数据映射到多个视图中。例如把一个文件的前10KB映射到一个视图A,把同一个文件的前4KB映射到视图B,只是映射的是同一个文件映射对象,则系统会确保各视图中的数据是一致的。

        如果应用程序在一个视图中修改了文件的内容,则系统会更新该视图对应文件映射对象的其它视图。 原因是系统是在同一个内存页面保存被映射的数据,即使该内存页面被多次映射到进程的地址空间中。

       如果多个进程把同一个数据文件映射到多个视图中,数据也会是一致的,因为数据文件中的每个页面在内存中只有一份。

3.用内存映射文件在进程间共享数据

    Windows提供了多种共享数据的机制,包括RPC、COM、OLE、DDE、Windows消息(尤其是WM_COPYDATA)、剪贴板、邮槽、管道、套接字等。其实共享数据最底层的机制是内存映射文件,这种共享机制是通过让两个或多个进程映射同一个文件映射对象的视图来实现的,这意味着进程间共享相同的物理存储页面。因此,当一个进程在视图中写入数据时,其它进程会在它们的视图中看到变化。注意:对于多个进程共享同一个文件映射对象,所有进程使用的文件映射 对象名称必须完全相同。

4.以页交换文件为后备存储器的内存映射文件

    许多程序在运行过程中创建一些数据,并需要将这些数据共享给其它进程,如果为了共享数据而将创建的数据保存在磁盘上的文件中,这将非常不方便,效率也较低。一种较好的方式是以页交换文件为后备存储器的内存映射文件,要实现这一点,只要在调用CreateFileMapping时,将INVALID_HANDLE_VALUE作为hFile参数传入,表示希望系统从页交换文件中调拔物理存储器。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章