内存映射文件

与虚拟内存一样,内存映射文件可以用来保留一个地址空间的区域,并将物理存储器提交给该区域。它们之间的差别是,物理存储器来自一个已经位于磁盘上的文件,而不是系统的页文件。一旦该文件被映射,就可以访问它,就像整个文件已经加载内存一样。

内存映射文件可以用于3个不同的目的:

1、系统使用内存映射文件,以便加载和执行.exe和DLL文件。这可以大大节省页文件空间和应用程序运行所需的时间。

2、可以使用内存映射文件来访问磁盘上的数据文件。这使你可以不必对文件执行I/O操作,并且可以不必对文件内容进行缓存。

3、可以使用内存映射文件,使同一台计算机上运行的多少进程能够相互之间共享数据。Windows确实提供了其他一些方法,以便在进程之间进行数据通信,但是这些方法都是使用内存映射文件来实现的,这使得内存映射文件成为单个计算机上的多个进程相互进行通信的最有效的方法。

 

一、在可执行文件和DLL的多个实例之间共享静态数据

每个.exe或DLL文件的映像都是由许多节组成的。

//Create Shared section & have compiler place initialized data in it.

#pragma data_seg("Share")

 //Initialized, in Shared section

int a = 0;

//Uninitialized, not in Shared section

int b;

//Have compiler stop placing initialized data in Shared section

#pragma data_seg()

 

//Initialized, in Shared section

__declspec(allocate("Shared"))int c = 0;

//Uninitialized, in Shared section

__declspec(allocate("Shared"))int d;

 

//Initialized, not in Shared section

int e = 0;

//Uninitialized, not in Shared section

上面的注释清楚地指明了指定的变量将被放入哪一节。若要用allocate声明的规则正确地起作用,那么首先必须创建节。如果删除前面这个代码的第一行#pragma data_seg,上面的代码将不进行编译。

仅仅告诉编译器将某些某些变量放入它们自己的节中,是不足以实现对这些变量的共享的。还必须告诉链接程序,某个节中的变量是需要加以共享的。若要进行这项操作,可以使用链接程序的命令行上的/SECTION开关:/SECTION:name,attributes。

在冒号的后面,放入你想要改变其属性的名字。在这个例子中,我们想要改变Shared节的属性。因此应该创建下面的链接程序开关:/SECTION:Shared, RWS。

在逗号后面,我们设定了需要的属性。R:read,W:write,E:execute,S:shared。

也可以使用下面的句法将链接程序开关嵌入到你的源代码中:

#pragma comment(linker, "/SECTION:Shared,RWS")

这一行代码告诉编译器将上面的字符串嵌入名字为“.drectve”的节。当链接程序将所有的.obj模块组合在一起时,链接程序就要查看每个.obj模块的“.drectve”节,并且规定所有的字符串均作为命令行参数传递给该链接程序。

二、内存映射数据文件

内存映射文件的物理存储器来自磁盘上的一个文件,而不是来自从系统的页文件中分配的空间。

 

 

阅读更多
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭