使用内存映射文件,同时允许其他进程完全访问

Posted

技术标签:

【中文标题】使用内存映射文件,同时允许其他进程完全访问【英文标题】:Using a memory-mapped file while allowing other processes full access 【发布时间】:2011-09-14 10:11:53 【问题描述】:

我正在尝试在 windows 下使用内存映射文件(使用 CreateFile/CreateFileMapping/MapViewOfFile 函数),并且我当前在调用 CREATE_FILE 时指定了 FILE_SHARE_READ 和 FILE_SHARE_WRITE。但是,这会锁定文件不被其他进程使用。

我想要的是在调用 CreateFileMapping 或 MapViewOfFile 时对文件进行内存映射快照,这样我就看不到对文件所做的任何更改(写入或删除)通过其他进程。有点像写时复制,但其他进程正在执行写操作。我可以在 Windows 上使用内存映射文件吗?

【问题讨论】:

出于好奇,这个文件有多大? 在这种情况下,除非条件非常特殊,否则我可能不会打扰,只需分配所需的内存并将文件读入其中即可。 (尽管如此,我还是给出了 +1,因为这是一个有趣的问题) 【参考方案1】:

这不是内存映射文件的工作方式。 Windows 对文件进行了硬锁定,这样任何人都无法更改其内容并使其与映射到 RAM 中的页面不同。 RAM 中的这些页面在创建文件视图的所有进程之间共享。没有“撕下”选项。

您可以简单地映射文件并复制视图中的字节。通常需要与其他进程进行一些同步。

【讨论】:

以上是关于使用内存映射文件,同时允许其他进程完全访问的主要内容,如果未能解决你的问题,请参考以下文章

文件映射原理及实现

高效率场景-内存映射

Linux内核之内存管理完全剖析

1-4_基本概念_进程间通信及同步

mmap

Linux共享内存