内存分配malloc
一、c库函数Malloc()和free()
Gun下默认会链接 libc库,路径为/lib64/libc.so.6。Malloc()类函数调用时相应的会调用libc中的maloc函数。


定义如图所示,其中用了一些gun的c关键字,大概意思为malloc的是__libc_malloc的别名,__malloc也是__libc_malloc的别名。

二、内存分配的具体实现
在调用__libc_malloc函数时首先会判断全局钩子函数malloc_hook_ini是否被定义,在libc库中钩子函数有被定义为malloc_hook_ini



其中用了gnuc的关键字将函数定义为弱符号。弱符号的使用为:若两个或两个以上全局符号(函数或变量名)名字一样,而其中之一声明为弱符号,则这些全局符号不会引发重定义错误。链接器会忽略弱符号,去使用普通的全局符号来解析所有对这些符号的引用,但当普通的全局符号不可用时,链接器会使用弱符号。
Malloc_hook_ini定义为:

意思为当没有其他全局钩子定义时,将调用libc自动的弱符号钩子函数Malloc_hook_ini
其中进行了ptmalloc分配器的初始化,随后将Malloc_hook_ini置为空,再次调用__libc_malloc函数最终在

_int_malloc()中实现内存分配,其中victim为返回的地址值,a_ptr为ptmalloc分配器维护的内存分配区,bytes为需要分配的内存大小。
第一次调用:
malloc->__libc_malloc->__malloc_hook->malloc_hook_in -> ptmalloc_init -> __libc_malloc -> _int_malloc
再次调用:
malloc -> __libc_malloc -> _int_malloc
最终小内存通过brk()和sbrk()系统调用与内核中进程地址空间中的堆区进行

本文详细探讨了C库函数malloc和free的工作原理,以及Ptmalloc与Jemalloc内存管理的差异,涉及内存分配实现、碎片管理、arena/bin/chunk概念、内存池和线程缓存。实测对比显示Jemalloc在性能和内存效率上优于Ptmalloc。
最低0.47元/天 解锁文章
1万+

被折叠的 条评论
为什么被折叠?



