Несколько вызовов malloc для внутреннего вызова mmap только один раз

Когда я пытаюсь выполнить приведенный ниже код, я не могу четко проанализировать внутренние вызовы malloc api. Что мне непонятно, так это системный вызов, mmap вызывается только один раз для 2 или более вызовов malloc. Если я также назначаю более 4069 байт, внутренний вызов только одного mmap (трассировка идентифицируется с помощью strace -p processid).

#include<stdio.h>
#include<stdlib.h>

main()
{
int *p,*q;
sleep(20);
p=malloc(5096);
printf("p=%p\n",p);
q=malloc(4096);
printf("q=%p\n",q);
sleep(2);
return 0;
}

Strace OUTPUT:

root@TEST:/home/harish# strace  -p 6109
Process 6109 attached
restart_syscall(<... resuming interrupted call ...>
) = 0
brk(0)                                  = 0xeca000
brk(0xeec000)                           = 0xeec000
fstat(1, {st_mode=S_IFCHR|0620, st_rdev=makedev(136, 14), ...}) = 0
mmap(NULL, 4096, PROT_READ|PROT_WRITE, MAP_PRIVATE|MAP_ANONYMOUS, -1, 0) = 0x7f10b7bc7000
write(1, "p=0xeca010\n", 11)            = 11
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({20, 0},
0x7ffc34a51790)      = 0
write(1, "q=0xecb020\n", 11)            = 11
rt_sigprocmask(SIG_BLOCK, [CHLD], [], 8) = 0
rt_sigaction(SIGCHLD, NULL, {SIG_DFL, [], 0}, 8) = 0
rt_sigprocmask(SIG_SETMASK, [], NULL, 8) = 0
nanosleep({2, 0}, 0x7ffc34a51790)       = 0
exit_group(0)                           = ?
+++ exited with 0 +++

Что я смотрю, так это то, что если malloc используется более одного раза, он вызовет более одного mmap, так как объем памяти в двух malloc превышает 4096

2 ответа

malloc() не приводит к mmap() вызов. Как правило, это приведет к brk(), Однако не каждый вызов приведет к brk(), Многое зависит от выделенных в данный момент страниц, запрошенной памяти и прочего.

Внутренняя куча вашего процесса (доступ через malloc, free и realloc) управляет памятью так, как считает нужным - это включает в себя:

  • увеличение кучи большими или фиксированными приращениями для амортизации стоимости дорогих brk/sbrk системные вызовы по нескольким (де) выделениям
  • иметь дело с меньшими (de) выделениями внутри этой области кучи
  • управление (де) фрагментацией выделенных записей

Также распространено использование различных механизмов для больших и малых выделений, например, небольшие объекты выделяются из этой смежной области, управляемой brk/sbrk, но отдельные большие объекты могут быть выделены непосредственно с mmap,

Другие вопросы по тегам