Как известно: http://linux.die.net/man/3/malloc
По умолчанию Linux следует оптимистичной стратегии распределения памяти. Это означает, что когда malloc() возвращает не-NULL, нет гарантии что память действительно доступна. В случае, если окажется, что система потеряла память, один или несколько процессов будут убиты Убийца OOM.
И мы можем успешно выделить 1 Петабайт VMA (область виртуальной памяти) с помощью malloc(petabyte);
: http://ideone.com/1yskmB
#include <stdio.h>
#include <stdlib.h>
int main(void) {
long long int petabyte = 1024LL * 1024LL * 1024LL * 1024LL * 1024LL; // 2^50
printf("petabyte %lld \n", petabyte);
volatile char *ptr = (volatile char *)malloc(petabyte);
printf("malloc() - success, ptr = %p \n", ptr);
ptr[petabyte - 1LL] = 10;
printf("ptr[petabyte - 1] = 10; - success \n");
printf("ptr[petabyte - 1] = %d \n", (int)(ptr[petabyte - 1LL]));
free((void*)ptr); // why the error is here?
//printf("free() - success \n");
return 0;
}
Результат:
Error time: 0 memory: 2292 signal:6
petabyte 1125899906842624
malloc() - success, ptr = 0x823e008
ptr[petabyte - 1] = 10; - success
ptr[petabyte - 1] = 10
И мы можем успешно получить доступ (store/load) до последнего члена петабайта, но почему мы получаем ошибку на free((void*)ptr);
?
Примечание: https://en.wikipedia.org/wiki/Petabyte
- 1000 ^ 5 PB petabyte
- 1024 ^ 5 PiB pebibyte - Я использую его
Итак, если мы хотим выделить больше, чем RAM + swap и обойти ограничение overcommit_memory
, тогда мы можем выделить память, используя VirtualAllocEx()
в Windows, или mmap()
в Linux, например:
- 16 TiB (16 * 2 ^ 40 байт), то мы можем использовать пример из ответа "Номинальный корень": qaru.site/info/279523/...
- 127 TiB (127 * 2 ^ 40 байт), то мы можем использовать
mmap()
с флагамиMAP_NORESERVE | MAP_PRIVATE | MAP_ANONYMOUS
иfd=-1
: http://coliru.stacked-crooked.com/a/c69ce8ad7fbe4560