我正在尝试在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;
}
Run Code Online (Sandbox Code Playgroud)
Die*_*Epp 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
Run Code Online (Sandbox Code Playgroud)
策略1"总是过度使用",这对某些应用程序很有用.政策2"永远不会过度使用".默认策略0允许一些过度使用,但使用启发式方法拒绝大型分配,例如计算机上出现故障的分配.
你也可以使用这个MAP_NORESERVE标志.请注意,如果内核的策略是"永远不会过度使用",内核将忽略此标志.
| 归档时间: |
|
| 查看次数: |
1221 次 |
| 最近记录: |