gpt4 book ai didi

c - 当 2 个程序映射同一个文件时,mmap 如何工作

转载 作者:太空狗 更新时间:2023-10-29 11:42:54 26 4
gpt4 key购买 nike

我在查看 man mmap 时试图了解 mmap 的工作原理.

据我了解,它向页表添加了一个映射,该页表映射了文件和虚拟地址(这是给定的地址 void *addr)

那么,当 2 个程序映射同一个文件时会发生什么?页表中是否有 2 个条目,每个程序一个?

最佳答案

So, what happens when 2 programs map the same file? Are there 2 entries in the page table, one for each program?

在现代操作系统中,每个进程都有自己的内存页表,它可能指向与其他用户和内核进程共享的物理内存页。

With MAP_SHARED, this mapping is shared: updates to the mapping are visible to other processes that map this file, and are carried through to the underlying file. The file may not actually be updated until msync(2) or munmap() is called.

这看起来很有趣,但是有很多警告:

  • 两个进程为同一个文件映射的实际页面可能驻留在每个进程中的相同地址或不同地址,将指针存储到此共享内存中可能不允许其他进程使用它们,因为它们可能指向不一致的地址。

  • 实现可能为两个映射使用相同的物理内存页面,也可能不使用相同的物理内存页面:出于微妙的原因(缓存策略、不同步读取...),即使它是相同的物理内存,由一个完成修改进程对其内存的影响可能不会立即反射(reflect)在其他进程的内存中。

因此,修改可能对映射文件或通过 readFILE* 流 API 读取文件的其他进程可见,也可能不可见。

如果其中一个进程调用 msync(),修改应该在所有映射和文件的所有未读部分中可见,请记住 FILE* 流式 API 可能已在内部非共享缓冲区中缓冲了一些数据:不会反射(reflect)此区域中的修改。

结论:使用这些机制来实现进程间通信是有风险且不可靠的。该行为可能取决于系统特定的特征,例如操作系统策略、CPU 和缓存架构、使用的 RAM 类型、时钟速度,谁知道还有什么。依赖经过验证的 API 更安全,这些 API 确实可以使用 mmapped 内存实现,但前提是知道它提供了正确的语义。

关于c - 当 2 个程序映射同一个文件时,mmap 如何工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35105415/

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