Как mmap может выделить более 20 Гб?

Я пытаюсь использовать функцию mmap для выделения большого объема памяти в виртуальном пространстве. Мне нужно около 30 Гб, но это не так. Я пробовал с 20Gb с тем же результатом. Я выполнил свой тест на 64-битном сервере OVH с 60 ГБ ОЗУ.

Мой тестовый код:

#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

Кто-то может сказать мне, можно ли выделить 30 ГБ виртуальной памяти с помощью mmap и почему? Иначе как выделить 30Gb другим способом?

Пожалуйста, не спрашивайте, почему я хочу сделать это, или это глупые или другие философские мысли.
Это моя потребность, и я просто хочу найти способ сделать это, если это возможно.

4

Решение

Я запустил вашу программу на Linux Mint 17 (примерно Ubuntu 14.04) x86_64 без ошибок. В моей системе 8 ГБ ОЗУ, 16 ГБ подкачки, большая часть 8 ГБ в настоящее время используется кешем страниц и 1-2 ГБ в настоящее время используется процессами.

(Кстати, для подобных вопросов вам действительно нужно подробно указать свою платформу.)

Я смог воспроизвести ваше сообщение об ошибке двумя разными способами.

Первый способ:

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

Второй способ (из новой оболочки):

$ ./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 задавать?

Я собираюсь немного погулять и заявить, что один из них — твой преступник.

2

Другие решения


По вопросам рекламы [email protected]