gpt4 book ai didi

c++ - Windows 上的写时复制文件映射

转载 作者:行者123 更新时间:2023-12-02 04:58:01 26 4
gpt4 key购买 nike

我有 3 个进程通过命名管道进行通信:服务器、写入器、读取器。基本思想是,编写器可以在服务器上存储巨大(~GB)的二进制 blob,读取器可以检索它。但不是在命名管道上发送数据,而是使用内存映射。

服务器使用CreateFileMapping创建一个未命名的文件支持映射,并提供PAGE_READWRITE保护,然后将句柄复制到编写器.在编写者完成其工作后,该句柄将被复制到任意数量的感兴趣的读者

编写器FILE_MAP_WRITE模式下使用MapViewOfFile映射句柄。

读取器FILE_MAP_READ|FILE_MAP_COPY模式下使用MapViewOfFile映射句柄。

读取器上,我想要写时复制语义,因此只要映射仅被读取,它就会在所有读取器实例之间共享。但如果读者想要写入(例如就地解析或图像处理),影响应仅限于尽可能减少复制页面数的修改过程。

问题
读取器尝试写入映射时,它会因段错误而死亡,就好像没有考虑FILE_MAP_COPY一样。上述方法有什么问题吗?根据 MSDN,这应该有效...

我们在 Linux 上也实现了相同的机制(使用 mmap 和 fd 在 AF_UNIX 辅助缓冲区中传递)并且它按预期工作。

最佳答案

这里的问题是MapViewOfFile设计或/和记录不良。这是 ZwMapViewOfSection 上的 shell(功能受限) 。 MapViewOfFiledwDesiredAccess 参数转换为 ZwMapViewOfSectionWin32Protect 参数.

FILE_MAP_READ|FILE_MAP_COPY 组合转换为 PAGE_READONLY 页面保护,因为这样您会在写入时出现页面错误。

您只需要使用FILE_MAP_COPY标志 - 它转换为PAGE_WRITECOPY页面保护,在这种情况下一切都会工作。

最好的解决方案当然是直接使用ZwMapViewOfSection具有PAGE_WRITECOPY页面保护

关于c++ - Windows 上的写时复制文件映射,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55018806/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com