mmap()在1TB ANONYMOUS文件中使用ENOMEM失败?

use*_*006 2 c

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