C-多个内部调用MMAP的多个Malloc调用一次



当我尝试以下代码时,我无法清楚地分析malloc api内部呼叫。我不清楚的是系统呼叫mmap仅在2个或更多的malloc调用中调用一次。

#include<stdio.h>
#include<stdlib.h>
main()
{
int *p,*q;
sleep(20);
p=malloc(5096);
printf("p=%pn",p);
q=malloc(4096);
printf("q=%pn",q);
sleep(2);
return 0;
}

strace输出:

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=0xeca010n", 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=0xecb020n", 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,因为在4096以上的两个Malloc的内存

中超过了内存

malloc()不会导致mmap()调用。通常,这将导致brk()。但是,并非每个呼叫都会导致brk()。这在很大程度上取决于当前分配的页面,询问的内存和其他内容。

您的过程'内部堆(通过malloc,免费和realloc访问)可以在其认为合适时管理内存 - 这包括:

  • 大量或固定的增量增加堆,以摊销昂贵的brk/sbrk SYSCALL的成本,而不是多个(de)分配
  • 处理该堆区域内部的较小(DE)分配
  • 管理(de)分配记录的分裂

也常用于大小分配的不同机制,例如,从brk/sbrk管理的连续区域分配小物体,但是单个大对象可以直接分配给mmap

相关内容

  • 没有找到相关文章

最新更新