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

时间:2010-05-06 16:14:30

标签: linux memory-management virtualalloc

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

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

编辑 - 用例

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

4 个答案:

答案 0 :(得分:28)

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

答案 1 :(得分:5)

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

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

答案 2 :(得分:4)

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

答案 3 :(得分:1)

  

“看似随机的不可接受的延迟   对于非常大的数组

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