何时以及如何将mmap的内存换入和换出?

时间:2017-04-21 11:19:55

标签: linux mmap

根据我的理解,mmap'适合RAM的文件就像将文件放在内存中一样。

假设我们有16G的RAM,我们首先mmap我们使用了一段时间的10G文件。这在访问方面应该相当有效。如果我们然后mmap第二个10G文件,那会导致第一个被换出吗?还是它的一部分?如果是这样,这会发生什么时候?在mmap调用,或访问新加载文件的内存区域?

如果我们想再次访问第一个文件的指针内存,是否会让它再次加载交换文件?那么,假设我们在对应于第一个文件和第二个文件的内存之间交替读取,会导致灾难性的表现吗?

最后,如果其中任何一个属实,那么mmap几个较小的文件会更好吗?

2 个答案:

答案 0 :(得分:4)

您的问题没有明确的答案,因为交换进出是由您的内核处理的,并且每个内核都有不同的实现(并且Linux本身提供不同的配置文件,具体取决于您的使用情况,RT,桌面,服务器......)

一般来说,无论你在内存中加载的内容都是使用页面完成的,因此内存中的mmap文件会在所有内存级别(缓存,RAM和交换)之间通过页面加载(和卸载)。 然后,如果你将两个10GB的数据加载到内存中,你将在RAM和你的Swap之间拥有部分内容,并且内核将尝试将你现在可能使用的页面保留在RAM中并猜测你下次将加载什么

这意味着如果您真正随机访问两个文件中的几个字节的数据,那么 应该期望可怕的性能,如果您从两个文件中顺序访问连续的块,或者应该期待体面的表现。

您可以阅读有关内核分页到虚拟内存理论的更多细节:

答案 1 :(得分:4)

如上所述,您的文件将以页面形式访问;在x86_64(和IA32)体系结构上,页面通常为4096字节。因此,如果在mmap时加载任何文件,则很少。第一次访问任一文件中的某个页面时,内核将生成page fault并加载一些文件。内核可以预取页面,因此可以加载多个页面。是否这样做取决于您的访问模式。

一般情况下,如果您的working set适合记忆,那么您的表现应该会很好。也就是说,如果您只是定期访问两个文件中的3G文件,只要您的流程可以使用3G的RAM,通常就可以了。

在64位系统上,没有理由拆分文件,如果你需要的部件容易放入RAM中,你就可以了。

请注意,如果您映射现有文件,则不需要交换空间来读取该文件。当一个对象由文件系统上的文件支持时,内核可以从该文件读取而不是交换空间。但是,如果在调用mmap时指定MMAP_PRIVATE,则在调用msync之前可能需要交换空间来保存更改的页面。