是否可以限制mmap内存使用?

问题描述 投票:0回答:1

我正在使用

mmap
读取大文件(50+GB),它主要是随机读取,我知道
mmap
不会将整个文件内容加载到内存中,而只会加载我访问的页面。

问题是,就我而言,即使是随机读取,我也只会读取文件的每个部分一次,所以我希望已经访问过的页面交换回磁盘,这样我就可以节省一些内存。

例如,我希望当

mmap
使用的RSS达到1GB时,操作系统将我读过的页面交换回磁盘,可以吗?

c linux mmap memory-mapped-files
1个回答
0
投票

我正在使用 mmap 读取大文件(50+GB),主要是随机读取,我知道 mmap 不会将整个文件内容加载到内存中,而只会加载我访问的页面。

好吧,只是不要那样想。让我告诉你会发生什么,

mmap
只是将文件内容映射到你的虚拟地址空间中。嗯,这听起来好像它已被加载到内存中,因为无论您进入文件的任何位置,它都会出现在那里,就好像它已被加载一样。当您第一次访问内存的某些部分时,会出现一个来自内核的陷阱(内核将整个内存映射段视为禁止的地方),并且实际上只从文件中读取一页,您正在访问的一个。这就好像内核已经读取了一页内存并将其放在那里。您会得到整个文件已被读取的效果。但要注意,就好像您只是到处挑选一样,内核将读取一页内存,让您感觉整个文件都在您的处置之下。该机制与交换器用于将进程的内存交换到内存中的机制完全相同。事实上,这就是当您的程序加载动态共享对象或在
mmap
系统调用期间首次加载程序代码时所做的事情......实际上只从文件中读取立即需要开始执行的页面,因为内核不'不知道你的程序是否会快速调用其他地方的代码(这将触发新页面被交换)或将永远保留在该页面中(这将使交换器高兴,因为没有工作要做)
    

© www.soinside.com 2019 - 2024. All rights reserved.