c код:
// 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 и проверив справочную страницу (с помощью автора TLPI), теперь я понимаю, как malloc()
решил использовать brk()
или mmap()
, а именно:
mallopt()
может устанавливать параметры для управления поведением malloc()
, и есть параметр с именем M_MMAP_THRESHOLD
, в общем:
- Если запрошенная память меньше, будет использовано
brk()
; - Если запрошенная память больше или равна ей, будет использовано
mmap()
;
Значение параметра по умолчанию - 128kb
(в моей системе), но в моей тестовой программе я использовал 1 МБ, поэтому было выбрано mmap()
, когда я изменил запрошенную память на 32 КБ, я увидел, что будет использоваться brk()
.
В книге это упоминается на страницах 147 и 1035 TLPI, но я не стал внимательно читать эту часть.
Подробную информацию о параметре можно найти на странице руководства для mallopt()
.
sbrk()
, который находится вunistd.h
. Без прототипа компилятор предполагает, что неизвестные функции возвращаютint
. - person JS1   schedule 30.05.2015sbrk()
был объявлен вstdlib.h
, спасибо! - person user218867   schedule 30.05.2015-Wall
и вижу предупреждениеwarning: implicit declaration of function ‘sbrk’
, хороший совет! - person user218867   schedule 30.05.2015