2014-11-02 2 views
1

Я пытаюсь выяснить, сколько максимальной памяти может быть выделено процессу с помощью malloc().sbrk, malloc - максимальная память, которая может быть выделена

Так суть в:

start = sbrk(0); 
malloc(1); /* so space is given to the data segment */ 
end = sbrk(0); /* start != end at this point */ 

/* Try to allocate in chunks as much as possible. */ 
while (end == sbrk(0)) { 
    malloc(1048576); 

    if (end == sbrk(0)){ 
     maxMemory = maxMemory + 1048576; 
    } 
} 

return maxMemory; 

Так то, что я не понимаю, что:

Если вы:

start = sbrk(0); 
malloc(1); 
end = sbrk(0); 

OK, конец = начало

Но:

start = sbrk(0); 
malloc(1048576); 
end = sbrk(0); 

начало == конец

Таким образом, в основном, разрыв программы (sbrk (0)) не перемещается с большими значениями. Таким образом, данный пока продолжается очень долго, пока sbrk (0) не перемещается, и я получаю действительно большое значение Max ~ 68gb.

Я бы ожидал, что любой malloc первоначально переместит сегмент данных, но это не так. Может ли кто-нибудь объяснить, почему это не так (где он его выделяет?) И/или что я делаю неправильно?

+0

Функция sbrk() предназначена только для использования в семействе функций malloc. поэтому не следует напрямую вызывать функции пользователя. – user3629249

+0

Эта строка: malloc (1); приводит к нескольким байтам сегмента .heap, а не к сегменту .data. Это также приводит к утечке памяти, поскольку возвращаемый указатель на выделенную память теряется. – user3629249

+0

hopefully end определяется как void * надеюсь, maxmemory определяется как (32-битная система) int maxmemory = 0 или (64-разрядная система) long long int maxmemory = 0; – user3629249

ответ

2

В glibc malloc implementation выделяет с использованием mmap() для больших блоков:

Обычно, таНос() выделяет память из кучи, и регулирует размера кучи по мере необходимости, используя sbrk (2). При распределении блоков памяти, превышающей байты MMAP_THRESHOLD, реализация glibc malloc() выделяет память как частное анонимное сопоставление с использованием mmap (2). MMAP_THRESHOLD по умолчанию 128 kB, но настраивается с использованием mallopt (3). Выделения, выполненные с использованием mmap (2), не имеют значения по ограничению ресурсов RLIMIT_DATA (см. Getrlimit (2)).

Этот порог может регулироваться с помощью mallopt() установив M_MMAP_THRESHOLD, но учтите, что новые версии библиотеки настроить этот порог динамически по умолчанию:

Примечание: В настоящее время, Glibc использует динамический порог MMAP по умолчанию , Начальное значение порогового значения составляет 128 * 1024, но когда блоки больше , чем текущий порог и меньше или равно , DEFAULT_MMAP_THRESHOLD_MAX освобождаются, пороговое значение корректируется вверх до размера освобожденного блока. Когда динамическое пороговое значение mmap находится в эффекте , порог для обрезки кучи также динамически , скорректированный с удвоенным динамическим порогом mmap. Динамическая настройка порога mmap отключена, если заданы какие-либо из параметров M_TRIM_THRESHOLD, M_TOP_PAD, M_MMAP_THRESHOLD или M_MMAP_MAX.

Смежные вопросы