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

Mas*_*man 16 linux mmap

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

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

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

最后,如果这是真的,那么mmap几个较小的文件会更好吗?

zmo*_*zmo 6

你的问题没有明确的答案,因为换入/换出是由你的内核处理的,每个内核都会有不同的实现(Linux本身根据你的使用情况提供不同的配置文件,RT,桌面,服务器\xe2\x80\ xa6)

\n\n

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

\n\n

这意味着,如果您真正随机访问两个文件中的几个字节的数据,您应该预期性能会很差,如果您交替从两个文件中顺序访问连续块,您应该预期良好的性能。

\n\n

您可以阅读有关虚拟内存理论中的内核分页的更多详细信息:

\n\n\n


Sam*_*man 6

如前所述,您的文件将在页面中访问;在x86_64(和IA32)架构上,页面通常为4096字节。因此,很少会在mmap时加载任何文件。第一次访问两个文件中的某个页面时,内核都会生成页面错误并加载一些文件。内核可能会预取页面,因此可能会加载多个页面。是否执行此操作取决于您的访问模式。

通常,如果您的工作集适合内存,那么您的性能应该很好。也就是说,如果您只是定期访问两个文件中的3G文件,只要您有3G RAM可用于您的进程,通常情况就可以了。

在64位系统上,没有理由分割文件,并且如果需要的部分倾向于放在RAM中,您会没事的。

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