内部调用mmap的多个malloc调用

时间:2016-06-15 08:37:18

标签: c memory malloc sbrk brk

当我尝试下面的代码时,我显然无法分析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 个答案:

答案 0 :(得分:2)

int gcd(int a ,int b){ if(a % b == 0) return b; return gcd(b,a%b); } 不会导致malloc()来电。通常它会导致mmap()。但是,并非每次通话都会产生brk()。它在很大程度上取决于当前分配的页面,内存和其他内容。

答案 1 :(得分:2)

您的进程'内部堆(通过malloc,free和realloc访问)管理内存,因为它包含:

  • 通过大量或固定增量增加堆,以分摊昂贵的brk / sbrk系统调用在多个(de)分配上的成本
  • 处理该堆区域内的较小(de)分配
  • 管理(de)分配记录的碎片

对大型和小型分配使用不同的机制也很常见,例如,小型对象是从brk / sbrk管理的连续区域分配的,但是单个大型对象可以直接分配给{ {1}}。