对于Ubuntu 20.04,我使用mmap映射磁盘文件(大约4G)。
该文件每天都在变化,因此我必须每天映射另一个文件。
而且我发现有时候(并非总是如此),尽管mmap完成了,但磁盘读取却迅速增加。
为什么mmap不能将所有文件都加载到内存中?
答案 0 :(得分:0)
为了理解问题,首先需要了解如果致电mmap()
会发生什么。
mmap()
可用于将虚拟内存映射到物理内存,也可以将文件映射到自己的虚拟内存。函数堆栈就像ksys_mmap_pgoff()->vm_mmap_pgoff()->do_mmap_pgoff()->do_mmap()
。此后,我们将构建用户空间内存映射,但是它只在虚拟内存中应用了一个新区域,我们还没有触及物理内存。当进程计划为此进程进行调度并且我们要寻址该物理内存时,它会触发页面错误中断并调用do_page_fault()->find_vma()->handle_mm_fault()
与物理内存进行真正的联系,对于不同的文件系统,我们将使用诸如{{1 }}。
现在让我们回到问题所在。ext3_filemap_fault()
将导致磁盘读取,但是我们不确定何时会发生。这取决于您何时使用它以及何时为该进程安排CPU。
此外,如果您使用mmap()
或其他工具,则会发现Linux操作系统具有名为free
和Buffer
的设计。
Cache
此机制将有助于加快I / O读/写速度,并且当您使用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)
时,也可能导致磁盘读取增加。