2

我正在尝试在 Fedora Linux x86_64(4G RAM 加 16G 交换)下映射一个 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;
}
4

1 回答 1

11

默认的 Linux 过量使用策略会阻止您分配这么多内存。您没有任何接近 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标志。请注意,如果内核的策略是“从不过度使用”,内核将忽略此标志。

于 2013-04-29T04:14:51.123 回答