47

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

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

编辑 - 用例

我正在考虑分配 4 GB 或类似的虚拟地址空间,但一次只提交 64K。这将为我提供一种零拷贝方式来将数组增加到 4 GB。这很重要,因为典型的双倍数组大小和副本会为非常大的数组引入看似随机的不可接受的延迟。

4

4 回答 4

39

mmap一个特殊的文件,例如/dev/zero(或使用 MAP_ANONYMOUS) as PROT_NONE,稍后使用mprotect提交。

于 2010-05-06T17:00:30.820 回答
6

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

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

于 2010-05-06T16:37:56.467 回答
4

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

于 2010-05-06T17:11:01.770 回答
1

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

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

于 2010-05-06T17:53:16.710 回答