gpt4 book ai didi

c++ - mmap如何分配超过20Gb?

转载 作者:塔克拉玛干 更新时间:2023-11-03 02:01:59 24 4
gpt4 key购买 nike

我尝试使用 mmap 函数在虚拟空间中分配大量内存。我的需求是大约 30Gb,但它不能。我尝试使用 20Gb,结果相同。我在具有 60Gb RAM 的 OVH 64 位机器服务器上执行了我的测试。

我的测试代码:

#include <stdio.h>
#include <string.h>
#include <sys/mman.h>
#include <errno.h>

int main()
{
void *r = NULL;

printf("%lu\n", sizeof(size_t));

r = mmap(NULL, ((size_t)20)*1024*1024*1024, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0);

printf("%d %s\n", r == MAP_FAILED, strerror(errno));

return 0;
}

执行结果:

8
1 Cannot allocate memory

有人可以告诉我是否可以使用 mmap 分配 30Gb 的虚拟内存,为什么?另外怎么用其他方式分配30Gb?

请不要问我为什么要这样做,或者这是愚蠢的或其他哲学思想。这是我的需要,如果可能的话,我只是想找到一种方法。

最佳答案

我在 Linux Mint 17(大约是 Ubuntu 14.04)x86_64 上运行你的程序没有错误。我的系统有 8G RAM,16G 交换空间,页面缓存当前使用的大部分 8G,进程当前使用的 1-2GB。

(顺便说一句,对于这样的问题,您确实需要详细说明您的平台。)

我能够以两种不同的方式重现您的错误消息。

第一种方式:

$ ./mmap
8
0 Success
$ ulimit -v 65536
$ ./mmap
8
1 Cannot allocate memory

第二种方式(从一个新的shell):

$ ./mmap
8
0 Success
$ sysctl vm.overcommit_memory
vm.overcommit_memory = 0
$ sudo sysctl vm.overcommit_memory=2
vm.overcommit_memory = 2
$ ./mmap
8
1 Cannot allocate memory

那么,正如@vz0 所问,ulimit -a 说了什么?

您有多少交换空间,正在使用多少内存,您的系统如何设置 vm.overcommit_memory

我要大胆地断言其中一个是你的罪魁祸首。

关于c++ - mmap如何分配超过20Gb?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27650691/

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