C mmap()在1TB匿名文件上使用ENOMEM失败?
我正在尝试在FedoraLinuxx86_64(4GRAM加16G交换)下mmap一个1TB的匿名文件。但我得到了ENOMEM“无法分配内存”,甚至对于32G,如下代码所示。我遗漏了什么吗?谢谢你提供任何线索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);
#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),则不可操作。