【问题标题】:Memory usage when files are loaded via mmap()通过 mmap() 加载文件时的内存使用情况
【发布时间】:2010-11-17 08:52:05
【问题描述】:

想知道通过 mmap() 映射文件的最大内存量与 linux 机器中的 RAM 大小之间是否存在关系。我尝试对一些文件进行内存映射,发现当“映射”使用接近“MemTotal”(通过 cat /proc/meminfo 查看)时,我无法再映射任何文件。

来自 64 位 linux 机器上的 /proc/meminfo :

内存总量:32909628 kB

MemFree:221744 kB

缓冲区:1800 kB

映射:31642928 kB

提交限制:38012616 kB

Committed_AS:42641120 kB

VmallocTotal:536870911 kB

Vmalloc已使用:299920 kB

VmallocChunk:536568999 kB

那么,我是否正确假设“映射”使用量永远不会超过“MemTotal”。我的困惑是我认为当我们映射文件时内存总是虚拟的。

谢谢!

【问题讨论】:

    标签: linux unix memory-management


    【解决方案1】:

    不,除非您已将自己的 memlock() 放入内存,否则您很可能会遇到操作系统映射地址空间限制。与您的 RAM 一样,它整齐地达到 32GB,这很可能是巧合。

    编辑:实际上,如果您使用的是 MAP_PRIVATE,那么您可能确实会达到内存限制(MAP_PRIVATE 被视为私有分配,因此需要物理 RAM 或交换来覆盖除非启用了主动过量使用)。如果您还没有,请尝试使用 MAP_SHARED。

    【讨论】:

    • 在我的问题中添加了更多信息。操作系统映射地址空间限制是指虚拟内存限制。但是我当时好像有很多虚拟内存。
    • 我的意思是单个进程一次可以映射多少地址空间的限制。
    • 我认为这在 64 位 linux 机器中会很多。我的程序仅将 1.5 GB 的文件加载到内存中。
    • 等等,你的程序是在 32 位运行的吗?这里只映射1.5G?
    • 我运行了一堆程序,每个程序加载一个不同的 1.5 GB 文件。是的,我的程序以 32 位运行。但是每个的堆和非堆大小都不超过2mb。
    【解决方案2】:

    您可以将较大的文件映射到适合内存的块中(参见 mmap 的 len 和 off 参数)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2017-09-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-08-08
      • 2013-12-31
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多