内存管理maclloc,jemalloc

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

内存分配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()系统调用与内核中进程地址空间中的堆区进行

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值