在linux中保留但不提交内存的任何方法?

Elo*_*off 33 linux memory-management virtualalloc

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

这实际上非常有用,但我想最终将我的应用程序移植到linux - 所以如果我以后无法移植它,我不想使用它.linux有办法做到这一点吗?

编辑 - 用例

我正在考虑分配4 GB或一些这样的虚拟地址空间,但一次只能提交64K.这将为我提供一种零拷贝方式来生成高达4 GB的阵列.这一点很重要,因为典型的两倍数组大小和副本会为非常大的数组引入看似随机的不可接受的延迟.

Ben*_*igt 31

mmap特殊文件,如/dev/zero(或使用MAP_ANONYMOUS)PROT_NONE,稍后使用mprotect进行提交.

  • @MarkR:对于linux,对于vm overcommit sysctl的某些设置,这是真的.`/ dev/zero`方法的mmap应该适用于任何POSIX操作系统,包括禁用vm overcommit的linux.阅读vm overcommit文档,`/ dev/zero`和无写访问的组合是导致块不计入提交限制的原因. (2认同)

Vla*_*lad 6

您可以使用内核过量使用在系统范围内转换此功能.这通常是许多发行版的默认设置.

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


Mat*_*ner 5

VirtualAlloc()的 Linux 等效项是mmap(),它提供相同的行为。然而,正如评论者指出的那样,只要内存未初始化(例如通过calloc()或用户代码),连续内存的保留就是调用malloc()的行为。

  • 顺便说一句,仅使用 malloc,我就能够在 linux x64 机器上以 4GB 块(2^15-3 左右)的形式分配略低于 128TB 的虚拟地址空间,开销约为 500MB(实际上太低了)甚至是每个 4kb 页的页表条目,但正好适合每个 2MB 页的 8 字节条目(内核中是否支持透明大页?) (2认同)