c code:
// program break mechanism
// TLPI exercise 7-1
#include <stdio.h>
#include <stdlib.h>
void program_break_test() {
printf("%10p\n", sbrk(0));
char *bl = malloc(1024 * 1024);
printf("%x\n", sbrk(0));
free(bl);
printf("%x\n", sbrk(0));
}
int main(int argc, char **argv) {
program_break_test();
return 0;
}
При компиляции следующего кода:
printf("%10p\n", sbrk(0));
Я получаю подсказку:
format ‘%p’ expects argument of type ‘void *’, but argument 2 has type ‘int’
Вопрос 1: Почему это?
И после я malloc(1024 * 1024)
кажется, что разрыв программы не изменился.
Вот результат:
9b12000
9b12000
9b12000
Вопрос 2: Распределяет ли память память в куче при запуске для будущего использования? Или компилятор изменит временной интервал для выделения? В противном случае, почему?
[обновление] Резюме: brk() или mmap()
После просмотра TLPI и проверки man-страницы (с помощью автора TLPI), теперь я понимаю, как malloc()
решить использовать brk()
или mmap()
, как показано ниже:
mallopt()
может устанавливать параметры для управления поведением malloc()
, и есть параметр с именем M_MMAP_THRESHOLD
, в общем случае:
- Если запрошенная память меньше, чем
brk()
, - Если запрошенная память больше или равна ей, будет использоваться
mmap()
;
Значение по умолчанию параметра 128kb
(в моей системе), но в моей тестовой программе я использовал 1Mb, поэтому был выбран mmap()
, когда я изменил запрашиваемую память на 32kb, я увидел, что brk()
будет б.
В книге упоминалось, что в TLPI стр. 147 и 1035, но я не читал внимательно эту часть.
Подробную информацию о параметре можно найти на странице руководства для mallopt()
.