首页 > 其他分享 >九浅一深Jemalloc5.3.0 -- ③浅*tcache

九浅一深Jemalloc5.3.0 -- ③浅*tcache

时间:2024-07-02 10:00:02浏览次数:18  
标签:bin head p1 -- malloc 九浅 一深 内存 stack

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

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

为了减少不同线程间的竞争,Jemalloc为每个线程配备了其专属的“布袋”(tcache,估计是thread cache的缩写)用来缓存一些立即可用的内存,而且布袋又分成了很多隔间(bin数组)用来区分不同大小的内存,比如bins[0]是8个字节大小的空闲内存,bins[1]是16个字节大小的空闲内存。。。,还是上节size class的那套。

注意: 此处的bins类型为cache_bin_t, 与arena_t中的bins类型bin_t不同。

来一个小程序试试手

//gcc tcache.c `jemalloc-config --libdir`/libjemalloc.a `jemalloc-config --libs` -g
#include <malloc.h>
#include <stdlib.h>
#include <string.h>


int main(int argc, char* argv[])
{
        void *p1= malloc(10);
        memset(p1,'a',10);
        void *p2=malloc(10);
        memset(p2,'b',10);

        free(p1);
        free(p2);

        return 0;
}

在第二个malloc下断点(第一个malloc比较复杂,需要先给tcache.bin[1]填充一梭子弹药,第二个malloc只需直接取子弹),慢慢单步

 让我们先直接看看用户是怎么得到内存的:361行ret就是返给用户的内存地址(p2, 我的机器上是0x7ffff741d010), stack_head中藏着重点。说句题外话:stack_head-1指向的内存值就是p1(已被使用)。

下面让我们把stack_head, stack_head-1指向的内存的值打出来。

 看着熟悉吧,分别是第一次和第二次malloc返给用户的结果。

可以想像,当free p1时是反向操作,即:stack_head往小(地址)方向移动,并把要释放的内存的地址赋给stack_head指向的格子。

cache_bin_alloc/cache_bin_dalloc都只是挪了下stack_head而已。请看下图理解这些过程。

 

好了,因为是“浅”说,就点到为止吧。

标签:bin,head,p1,--,malloc,九浅,一深,内存,stack
From: https://blog.csdn.net/zhaiminlove/article/details/139653608

相关文章

  • 毕业设计-基于Springboot+Vue的班级综合测评管理系统的设计与实现(源码+LW+包运行)
    基于SpringBoot+Vue的班级综合测评管理系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1N_GWua74rAi1Qtkj1VpmHQ?pwd=zmut随着互联网技术的高速发展,人们生活的各方面都受到互联......
  • 京东商品详情数据接口(JD.item_get)
    京东(JD.COM)作为一个大型电商平台,提供了丰富的API接口供开发者使用,以便实现与京东平台的数据交互。然而,关于你提到的“京东商品详情数据接口(JD.item_get)”,这并不是京东官方直接提供的API接口名称。京东的开放平台(JDP)通常提供了一系列API,如商品查询、订单查询、物流查询等,但具体......
  • 毕业设计-基于Springboot+Vue的冬奥会科普系统的设计与实现(源码+LW+包运行)
    基于SpringBoot+Vue的冬奥会科普系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1YFTiNrYkLJAyvU40nmzbSg?pwd=x44b任何平台都要遵循平台设计的基本流程,本平台也不例外,同样需要......
  • python中对于redis依赖的一些版本记录
    一、redis不同版本对于集群和单节点的区别:1.在redis版本高于等于4.1.0支持集群方式链接(官网实例:https://redis-py.readthedocs.io/en/stable/clustering.html)推荐只使用redis官方依赖该与4.1.0的稳定版本进行支持 2.如果使用redis-py-cluster,进行对redis集群的连接,安装依赖时......
  • Java 并发 - ThreadLocal详解
    ThreadLocal是通过线程隔离的方式防止任务在共享资源上产生冲突,线程本地存储是一种自动化机制,可以为使用相同变量的每个不同线程都创建不同的存储。@立刀旁目录#带着BAT大厂的面试问题去理解#ThreadLocal简介#ThreadLocal理解#ThreadLocal原理#如何实现线程隔......
  • Rider如何针对一个项目禁用某一类错误检查(Inspections)的办法
       Rider的Inspections确实是非常好的功能,但是也并非每一种检查都适合当前项目,有的检查对于当前项目可能是没有意义的,比如对于一个基础库,将很多未使用的属性、方法、类等设置为public是很合理的,但是Rider会高亮提醒,这可能不是我们想要的,所以我们可能想针对当前项目禁止这种......
  • 毕业设计-基于Springboot+Vue的校友社交系统的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89460925基于SpringBoot+Vue的校友社交系统开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1gbqldVNoi7Shkp9jlM-fzg?pwd=tk......
  • JUC工具类: Exchanger详解
    Exchanger是用于线程协作的工具类,主要用于两个线程之间的数据交换。@立刀旁目录#带着BAT大厂的面试问题去理解Exchanger#Exchanger简介#Exchanger实现机制#Exchanger源码解析#内部类-Participant#内部类-Node#核心属性#构造函数#核心方法-exchang......
  • 毕业设计-基于Springboot+Vue的毕业生信息招聘平台的设计与实现(源码+LW+包运行)
    源码获取:https://download.csdn.net/download/u011832806/89431634基于SpringBoot+Vue的毕业生信息招聘平台开发语言:Java数据库:MySQL技术:SpringBoot+MyBatis+Vue.js工具:IDEA/Ecilpse、Navicat、Maven系统演示视频:链接:https://pan.baidu.com/s/1-X-CEV8YNsWo7e-pA8pv7g?......
  • Linux 下 zookeeper 集群部署
    目录1.zookeeper下载2.环境准备3.zookeeper部署3.1 修改系统配置文件3.2开放端口3.3安装zookeeper3.4 验证4.设置服务开机自启动本文将以三台服务器为例,介绍在linux系统下zookeeper的部署方式。1.zookeeper下载  下载地址:Indexof/dist/zookeeper(a......