我正在尝试在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;
}
答案 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
标志。请注意,如果内核的策略是“永远不会过度使用”,内核将忽略此标志。