我有一个包含图像文件的大 tar 文件(60GB)。我正在使用mmap()
整个文件来读取这些随机访问的图像。
我使用的mmap()
原因如下:
- 线程安全——我无法从多个线程中寻找 ifstream。
- 我可以避免额外的缓冲。
- 我得到了一些缓存(以已驻留的请求页面的形式)。
问题是当我读取完 60GB 文件中的所有图像后会发生什么?当然,并不是所有的图像都会被立即使用——它们会被读取、显示,然后被丢弃。
我的mmap()
电话是:
mmap(0, totalSize, PROT_READ, MAP_SHARED | MAP_NORESERVE, fd, 0);
问题是:内核是否看到我已经映射了文件支持的只读页面,并简单地清除了内存压力下未使用的页面?我不确定这个案子是否得到承认。手册页表明MAP_NORESERVE
不需要支持交换空间,但似乎无法保证页面在内存压力下会发生什么。是否可以保证内核在清除文件系统缓存或 OOM 的另一个进程之前清除不需要的页面?
谢谢!
答案1
只读mmap
很大程度上相当于open
后面跟着lseek
and read
。如果进程中映射的一块内存由文件备份,则 RAM 中的副本将被视为磁盘缓存的一部分,并将在内存压力下被释放,就像从read
文件创建磁盘缓存条目一样。
我还没有检查源代码,但我相信MAP_NORESERVE
对于只读映射来说没有什么区别。