Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/c/70.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/visual-studio-2012/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C mmap()在1TB匿名文件上使用ENOMEM失败?_C - Fatal编程技术网

C mmap()在1TB匿名文件上使用ENOMEM失败?

C mmap()在1TB匿名文件上使用ENOMEM失败?,c,C,我正在尝试在FedoraLinuxx86_64(4GRAM加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);

我正在尝试在FedoraLinuxx86_64(4GRAM加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;
}

\define HEAP_SIZE(1UL默认的Linux Overmit策略阻止您分配这么多内存。您没有接近1TB的RAM,内核现在将为您提供
ENOMEM
,而不是稍后运行OOM killer…但是您可以更改此策略

$ /sbin/sysctl vm.overcommit_memory
vm.overcommit_memory = 0
$ sudo /sbin/sysctl vm.overcommit_memory=1
vm.overcommit_memory = 1
策略1是“始终超额分配”,这对某些应用程序很有用。策略2是“从不超额分配”。默认策略0允许某些超额分配,但使用启发式方法拒绝较大的分配,例如在计算机上失败的分配

可供替代的
您还可以使用
MAP\u NORESERVE
标志。请注意,如果内核的策略是“永不过度提交”,那么内核将忽略此标志.

+1用于
MAP\u NORESERVE
。如果这是一种应用程序,您可以腾出时间允许稍后将内容分页,那么此标志可能适合您。
MAP\u NORESERVE
如果完全关闭了Overmit(2),则不可操作。