mmap 内存对内存压力的行为

mmap 内存对内存压力的行为

我有一个包含图像文件的大 tar 文件(60GB)。我正在使用mmap()整个文件来读取这些随机访问的图像。

我使用的mmap()原因如下:

  1. 线程安全——我无法从多个线程中寻找 ifstream。
  2. 我可以避免额外的缓冲。
  3. 我得到了一些缓存(以已驻留的请求页面的形式)。

问题是当我读取完 60GB 文件中的所有图像后会发生什么?当然,并不是所有的图像都会被立即使用——它们会被读取、显示,然后被丢弃。

我的mmap()电话是:

mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0); 

问题是:内核是否看到我已经映射了文件支持的只读页面,并简单地清除了内存压力下未使用的页面?我不确定这个案子是否得到承认。手册页表明MAP_NORESERVE不需要支持交换空间,但似乎无法保证页面在内存压力下会发生什么。是否可以保证内核在清除文件系统缓存或 OOM 的另一个进程之前清除不需要的页面?

谢谢!

答案1

只读mmap很大程度上相当于open后面跟着lseekand read。如果进程中映射的一块内存由文件备份,则 RAM 中的副本将被视为磁盘缓存的一部分,并将在内存压力下被释放,就像从read文件创建磁盘缓存条目一样。

我还没有检查源代码,但我相信MAP_NORESERVE对于只读映射来说没有什么区别。

相关内容