九浅一深Jemalloc5.3.0 -- ⑥浅*boot

19 篇文章 0 订阅
12 篇文章 1 订阅

目前市面上有不少分析Jemalloc老版本的博文,但最新版本5.3.0却少之又少。而且5.3.0的架构与5之前的版本有较大不同,本着“与时俱进”、“由浅入深”的宗旨,我将逐步分析最新release版本Jemalloc5.3.0的实现。

另外,单讲实现代码是极其枯燥的,我将尽量每个原理知识点都用一个简简单单的小程序引出,这样便于大家测试和上手调试。另外,我还会用GDB打印数据结构、变量的值,方便理解当时的状态或算法。

 你有没有想过:jemalloc自己所用的一些数据结构对应的变量如edata_t,bin_t, tcache_bin_t是怎么分配来的?它们不可能来自malloc函数,因为jemalloc还没成型。这就成了另外一个问题:jemalloc是如何引导的?jemalloc引导相关的函数都以_boot结尾,它们都在这:

下面挑几个重要的分别详述。

1. base_boot 创建base&base_block_t

这里第二块内存(base_t) jemalloc取名为b0.

base_block_t中的edata是对后面剩余的大小为0x1fef80的空闲内存(extent)的描述,以后用来分配内部使用的内存。

从此base_alloc即可使用,用来分配内部数据结构比如edata_t。

2. tcache_boot - 创建tcache_bin_info&计算tcache_bin_alloc_size

从上面的剩余的大小为0x1fef80的空闲内存切割一块大小为82字节的内存,由tcache_bin_info[ ]记录, 它描述的是某个size class最多tcache多少个region的地址。

然后由tcache_bin_info计算出一块内存的大小(tcache_bin_alloc_size,下面红框内存的大小),用来放一些指针。只计算了大小并未分配。

tcache\_bin\_alloc\_size= \sum_{0}^{40}tcache\_bin\_info[i]*sizeof(void*)

 + 冗余2个指针=24784字节

 即下面红框内存的大小,每个项都是指针。

3. arena_init - 创建arena

上面的tcache_bin_info 和这里的arena都是用函数base_alloc从第一节base_boot中剩余的内存切割出一块内存。arena分配后,内存结构如下

4. malloc_tsd_boot0 - tsd_tcache_data_init 分配tcache_bin

还记得上面第二节计算出来的tcache_bin_alloc_size吗?此处要分配了。大小24784 bytes, 实际分配32768 bytes.

jemalloc会分配一块extent来满足它,但是extent要用edata_t来描述,故同时要分配一个edata_t。

从此,tcache可用。

但要记得:tcache的弹夹有了(红框表示的部分),但是是空的,需要fill,这是⑤浅的内容。

  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

深山老宅

鸡蛋不错的话,要不要激励下母鸡

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值