mmap()在1TB ANONYMOUS文件中使用ENOMEM失败?

时间:2013-04-29 04:06:16

标签: c

我正在尝试在Fedora Linux x86_64(4G RAM加16G交换)下mmap一个1TB匿名文件。但我得到ENOMEM“无法分配内存”,甚至为32G作为以下代码。我错过了什么吗?感谢任何线索。

#define HEAP_SIZE (1UL << 35)
int main()
{
    void *addr = mmap(0, HEAP_SIZE, PROT_READ | PROT_WRITE, MAP_SHARED | MAP_ANONYMOUS, -1, 0);
    if (addr == MAP_FAILED)
    {
        perror(NULL);
        return 1;
    }
    printf("mmap %d gbytes succeed\n", HEAP_SIZE/(1UL << 30));
    return 0;
}

1 个答案:

答案 0 :(得分:11)

默认的Linux overcommit策略会阻止您分配这么多内存。你没有接近1TB的RAM,内核现在会给你ENOMEM而不是以后运行OOM杀手......但你可以改变这个政策。

$ /sbin/sysctl vm.overcommit_memory
vm.overcommit_memory = 0
$ sudo /sbin/sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1

策略1“总是过度使用”,这对某些应用程序很有用。政策2“永远不会过度使用”。默认策略0允许一些过度使用但使用启发式方法拒绝大型分配,例如计算机上出现故障的分配。

替代

您也可以使用MAP_NORESERVE标志。请注意,如果内核的策略是“永远不会过度使用”,内核将忽略此标志。