Macos mmap有多聪明?
Macos mmap有多聪明?,macos,unix,linux-kernel,mmap,Macos,Unix,Linux Kernel,Mmap,mmap可用于在进程之间共享只读内存,减少内存足迹: 进程P1mmaps一个文件,使用映射的内存->将数据加载到RAM中 进程P2mmaps一个文件,使用映射的内存->操作系统重新使用相同的内存 但这个呢: 处理P1mmaps文件,将其加载到内存中,然后退出 另一个进程P2mmaps访问同一个文件,访问P1访问时仍处于热状态的内存 是否再次从磁盘加载数据?操作系统是否足够智能,即使“mmap count”暂时降至零,也可以重新使用虚拟内存 不同操作系统之间的行为是否不同?(我主要对Linux/O
mmap
可用于在进程之间共享只读内存,减少内存足迹:
mmap
s一个文件,使用映射的内存->将数据加载到RAM中mmap
s一个文件,使用映射的内存->操作系统重新使用相同的内存mmap
s文件,将其加载到内存中,然后退出李>
mmap
s访问同一个文件,访问P1访问时仍处于热状态的内存mmap
ed,这样它就不会留下至少一个进程的地址空间,会有帮助吗
当然,当我mmap
和munmap
在同一个过程中连续快速地(但不一定)处理同一个文件时,我对性能感兴趣
EDIT2:我看到的答案非常详细地描述了完全不相关的问题。为了重申这一点,我是否可以依靠Linux/OS X不重新加载已驻留在内存中的数据,这些数据来自
mmap
ed内存段中的上一页点击,即使特定区域不再被任何进程mmap
加密?内存中文件内容的存在或不存在与mmap
系统调用的耦合比您想象的要小得多。当您mmap
一个文件时,它不一定会将其加载到内存中。当您munmap
it(或者如果进程退出)时,它不一定放弃页面
有许多不同的事情可以触发将文件内容加载到内存中:映射文件、正常读取文件、执行文件、尝试访问映射到文件的内存。类似地,有不同的事情可能会导致文件的内容从内存中删除,这主要与操作系统决定要将内存用于更重要的内容有关
在您的问题的两个场景中,考虑在步骤1和步骤2之间插入一个步骤:
- 1.5。另一个进程分配并使用大量内存->将
ed文件从内存中移出以腾出空间mmap
- 1.5。什么也没发生->mmap
ed文件的内容挂在内存中
对于不断访问文件以确保其保存在内存中的后台进程(例如,通过扫描文件,然后在循环中短暂休眠),这当然会迫使文件保留在内存中。但您最好让操作系统自行决定何时退出文件以及何时不退出文件。第二个进程可能会在缓冲区缓存中找到第一个进程的数据。因此,在大多数情况下,数据不会再次从磁盘加载。但由于缓冲区缓存是一个缓存,因此不能保证页面不会在中间被逐出 您可以启动第三个进程,并使用mmap(2)和mlock(2)修复ram中的页面。但这可能会带来更多的麻烦
Linux将UNIX缓冲区缓存替换为。但原则仍然是一样的。Mac OS X等价物被称为。我几乎可以肯定
mmap
的规范没有说明操作系统应该如何备份内存。我甚至几乎可以肯定,你的第一个假设也是错误的,没有任何东西说操作系统必须为两个进程使用相同的物理内存。@zneak:谢谢,但我的问题不是假设的假设。我很确定我提到的两个操作系统都有一个具体的答案。我更像是:1)处理一个mmaps文件2)处理a读/写mmaped区域,导致内核从文件中“出错”内存3)可能存在内存压力,导致内存“出错”,直到进程a再次需要它。4) 进程A再次需要内存,它被重新加载5)进程A映射内存6)进程B映射文件7)进程B读取/写入内存,如果它仍然在缓冲区缓存中,则不需要重新加载。我认为很明显我确实在问1.5。什么也没发生->mmaped文件的内容挂在内存中。
,很抱歉造成混淆。现在,你是说一个新的mmap
可以潜在地重复使用早些时候mmap
ed、loaded、munmap
ed的页面吗?(让我们把它缩小到Linux/OS X上的只读模式)。如果文件的页面仍然在内存中,因为它以前已被读取/映射/执行/预加载/缓存,它将按原样使用它们。如果他们因为被驱逐而不在那里,那就不会了。就这么简单。谢谢你@Celada,这是一个明确的答案。如果没有争用,我会接受。第一个进程甚至不必mmap()
文件-它可以read()
它,第二个进程中的后续mmap()
仍将映射相同的页面缓存页。@caf确定吗<与mmap
相比,code>read在文件加载和缓存方面使用了一种完全不同的机制,从设计上看。@user124114没有问题。我把你的问题投了更高的票给你。