代码之家  ›  专栏  ›  技术社区  ›  Eloff

在Linux中有保留但不提交内存的方法吗?

  •  30
  • Eloff  · 技术社区  · 14 年前

    Windows有virtualloc,它允许您保留地址空间的连续区域,但实际上不使用任何物理内存。稍后,当您想要使用它(或它的一部分)时,您再次调用virtuaalloc来提交以前保留的页面的区域。

    这实际上非常有用,但我希望最终将我的应用程序移植到Linux上——所以如果以后不能移植它,我就不想使用它。Linux有办法做到这一点吗?

    编辑-用例

    我正在考虑分配4GB或类似的虚拟地址空间,但一次只能提交64K。这将为我提供一种零拷贝的方式,使阵列增长到4GB。这一点很重要,因为典型的两倍阵列大小和拷贝会给非常大的阵列带来看似随机的、不可接受的延迟。

    4 回复  |  直到 11 年前
        1
  •  28
  •   Ben Voigt Caesar    14 年前

    mmap 一个特殊的文件,比如 /dev/zero (或使用地图匿名)作为 PROT_NONE ,以后使用 mprotect 承诺。

        2
  •  5
  •   Vlad    14 年前

    您可以通过使用内核过度提交在系统范围内启用此功能。这通常是许多分发版的默认设置。

    这是解释 http://www.mjmwired.net/kernel/Documentation/vm/overcommit-accounting

        3
  •  4
  •   Matt Joiner    14 年前

    Linux相当于 VirtualAlloc() mmap() 提供相同的行为。然而,正如一位评论者指出的,连续内存的保留是调用 malloc() 只要内存未初始化(例如 calloc() 或用户代码)。

        4
  •  1
  •   Brian    14 年前

    “看似随机、不可接受的延迟 对于非常大的阵列

    您还可以考虑mlock()或mmap()。+ MAP_LOCKED 以减轻分页的影响。许多CPU支持大(又称大)页面,页面大于4KB。这些较大的页面可以减轻TLB对流式读/写的影响。

    推荐文章