gpt4 book ai didi

c - mmap() 在 1TB 匿名文件上因 ENOMEM 失败?

转载 作者:行者123 更新时间:2023-12-04 10:08:22 25 4
gpt4 key购买 nike

我正在尝试在 Fedora Linux x86_64(4G 内存加 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;
}

最佳答案

默认的 Linux 过量使用策略会阻止您分配这么多内存。你没有接近 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 是“永不过度 promise ”。默认策略 0 允许一些过度使用,但使用启发式方法拒绝大量分配,例如在您的计算机上失败的分配。

备选

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

关于c - mmap() 在 1TB 匿名文件上因 ENOMEM 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16271041/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com