共享内存

【勇芳软件工作室】汉化HomePreviousNext

在Win32 API中,共享内存是通过文??件映射实现的。由其他分配方法(GlobalAllocLocalAllocHeapAllocVirtualAlloc功能)分配的所有内存仅可由调用进程访问。然而,由DLL分配的内存位于调用该DLL的进程的地址空间中,并且使用相同的DLL不能访问其他进程。

命名文件映射提供了创建一个共享内存块的简单方法。进程可以在使用CreateFileMapping函数创建文件映射对象时指定名称。其他进程可以为CreateFileMappingOpenFileMapping函数指定相同的名称,以获取映射对象的句柄。事件对象,信号量对象,互斥对象和文件映射对象的名称共享相同的名称空间。如果指定的名称与不同类型的现有对象的名称相匹配,则会发生错误。创建命名对象时,尝试使用唯一的名称,并检查重复名称错误的函数返回值。

每个进程在MapViewOfFile函数中指定其文件映射对象的句柄,将文件的视图映射到自己的地址空间中。单个文件映射对象的所有进程的视图映射到物理存储的相同共享页面。但是,映射视图的虚拟地址可以从一个进程变化到另一个进程,除非MapViewOfFileEx函数用于将视图映射到指定的地址。虽然可共享,但用于映射文件视图的物理存储的页面不是全局的;对于尚未映射文件视图的进程,它们无法访问。

文件映射对象与映射视图从物理内存交换到磁盘上时使用的磁盘文件相关联。该磁盘交换文件可以是系统的分页文件,也可以是在创建文件映射对象时指定的其他文件。在这种情况下,内存与文件的内容一起被初始化。在文件系统中映射指定的文件对于需要共享现有文件中的数据或者想要使用该文件来保存共享进程生成的数据的进程很有用。如果您映射指定的文件,则应将其打开以进行独占访问,并保持句柄打开,直到完成共享内存。保持打开将阻止其他进程在文件上打开另一个句柄以使用ReadFileWriteFile或为同一文件创建其他映射对象,任何一个操作都可能导致不可预测的结果。

当通过映射对象的视图的最后一个进程通过调用UnmapViewOfFile函数来终止或取消映射视图时,释放通过映射文件视图而提交的任何页面。此时,与映射对象关联的指定文件(如果有)会被更新。还可以通过调用FlushViewOfFile功能强制更改指定的文件。

有关文件映射的更多信息,请参阅文件映射.有关DLL中共享内存的示例,请参阅动态链接库.

如果多个进程具有对共享内存的写入访问权限,则应同步访问内存。有关进程间同步的更多信息,请参阅同步.