关于CreateMappingFile和Memory映射文件

时间:2011-10-21 20:56:19

标签: c++ winapi shared-memory

我试着读了很多关于CreateMappingFile的资源,但不幸的是我没有那么好的英语,所以我需要问一下如果它是真的我得出的结论:

CreateMappingFile为虚拟内存中的文件创建一个类似RAM的结构,而不是RAM,因此这个结构(或任何被调用的)位于硬盘中,但其形式已准备就绪转移到RAM。当我们需要将此结构传输到RAM时,我们使用MapViewOfFile

是吗?

2 个答案:

答案 0 :(得分:6)

CreateFileMapping只是准备一个用于映射的文件,并为文件映射分配一个句柄。 MapViewOfFile实际上为映射调用进程的虚拟地址空间中的地址。

由操作系统决定如何将物理RAM专用于该文件映射。每当进程读取或写入映射时,必须至少有一页物理RAM供进程读取或写入。操作系统将根据需要使用物理RAM支持映射(这称为'故障')并从映射中删除物理RAM,因为其他目的需要物理RAM。

映射使用多少物理RAM的管理完全取决于操作系统。通常,操作系统会在访问映射的页面时使用物理RAM(可能是前几页),并且只有当它对其认为更重要的内存有一些其他用途时才会删除页面。 / p>

顺便说一句,在现代操作系统上,可执行文件完全相同。当您运行可执行文件时,它会映射到进程的内存空间,并且在程序运行时,可执行文件的页面也会根据需要出错。

答案 1 :(得分:1)

此函数允许用户空间程序向OS请求创建内存映射。

内存映射是一种操作系统结构,它包含与进程的虚拟内存区域相关的信息:启动虚拟地址,长度,权限,后备存储(无论是换出文件还是交换),... < / p>

在* nix中,只有一个调用(mmap())允许您创建该映射。 Windows从该映射的实际“实例化”中分离映射的“准备”(分配句柄并赋予其名称)。

因此,在Windows中,要共享进程之间的映射(所谓的共享内存),您将使用相同的“名称”从每个进程CreteFileMapping(),然后在访问映射之前,您将使用{{{{}进行实例化。 1}}(在* nix中你会将MapViewOfFile()标志传递给MAP_SHARED并且内核的vm部分将共享内存;我猜这种差异主要是由不同的API样式首选项引起的每个平台)。