为什么mmap仍然增加磁盘读取



对于Ubuntu 20.04,我使用mmap映射磁盘文件(大约4G(。文件每天都在更改,所以我不得不每天重新映射另一个文件
我发现有时(并非总是(,尽管mmap完成了,但磁盘读取量增加得很快
为什么mmap没有将所有文件加载到内存中?

为了理解问题,首先需要了解如果调用mmap()会发生什么。

mmap()可以用于将虚拟内存映射到物理内存,也可以将文件映射到自己的虚拟内存。函数堆栈类似于ksys_mmap_pgoff()->vm_mmap_pgoff()->do_mmap_pgoff()->do_mmap()。之后,我们将构建用户空间内存映射,但它只在虚拟内存中应用了一个新的区域,我们还没有触及物理内存。当进程调度到这个进程,并且我们想要寻址这个物理内存时,它会触发页面故障中断并调用do_page_fault()->find_vma()->handle_mm_fault()来真正接触物理内存,对于不同的文件系统,我们会使用不同的函数,如ext3_filemap_fault()

现在让我们回到问题上来。mmap()将导致磁盘读取,但我们不能确定何时会发生。这取决于您何时使用它以及CPU何时对此进程进行调度。

此外,如果你使用free或其他工具,你会发现Linux操作系统有一个名为BufferCache的设计。

buffers    Memory used by kernel buffers (Buffers in /proc/meminfo)
cache      Memory used by the page cache and slabs (Cached and SReclaimable in /proc/meminfo)

此机制将有助于提高I/O读/写速度,并且在使用mmap()时也可能导致磁盘读取增加。

最新更新