TCMalloc的使用与源码剖析之六---------TCMalloc中内存分配流程
来源:互联网 发布:matlab 中文论坛 知乎 编辑:程序博客网 时间:2024/05/17 15:19
内存分配流程图如上图,具体流程如下:
1、 Tcmalloc首先判断malloc的size是否大于kMaxSize,如果小于这个值,那么将size转换为想的obj class,然后从当前thread私有的cache中Allocate,转至第2步。如果请求的size大于kMaxSize那么跳至第10。
2、 首先判断当前的threadcache中obj calss对应的freelist中是否包含有空闲的obj,如果有直接pop出来,否则从CentralCache中拿,转下一步。
3、CentralCache和ThreadCache之间obj的转移采用batch方式,每次转移固定数量的obj,这个数量通过Static::sizemap()->num_objects_to_move定义,当然在决定最终转移数量时还是需要不能超过ThreadCache相应list的maxlength。然后通过CentralCache对应freelist的RemoveRange函数将确定大小的obj转移出来,并通过对应list的PushRange函数将这些obj插入ThreadCache对应的freelist。
4、 CentralCache通过RemoveRange将特定数量的obj移出,CentralCache将连续的内存看做一个Span,Span是CentralCache管理内存的一个主要数据结构。而Span又被切分成N个统一大小的obj。
5、 在Allocate的过程中,首先判断需要Allocate的obj数量是不是正好符合num_objects_to_move,如果是而且CentralCache用来存放span的slots不为空,那么直接从slots里面拿,否则从nonempty队列中的Span拿。
6、 Nonempty队列存放了所有可用的Span,那么从头开始一个个拿,如果拿光了还是不能满足要求,那么只能通过向pageheap要求一个span,这个span的size由class_to_pages决定,然后再将这个Span切成obj返回给CentralCache。然后再次尝试从Span分配。
7、 Pageheap管理整个系统page级别的allocate,他通过两个数据结构管理所有的Span(free_数组和large_列表),free_数组存放size小于kMaxPages的Span,而large_列表存放大于等于kMaxPages的Span。PageHeap首先判断要求的pages是否大于等于kMaxPages,如果小于那么先从free数组中找,从要求大小的位置开始往后找,先找normal队列再找return对队列。如果在normal队列中找到且找到的Span状态为Span::ON_NORMAL_FREELIST,那么直接从里面切出需要的Span返回给CentralCache。如果在return队列中找到且找到的Span状态为Span::ON_RETURNED_FREELIST那么直接从里面切出需要的Span返回给CentralCache。
8、 如果需要的size不符合上述要求或者在上述队列中没有找到那么将从large_队列中找。从large_队列中查找时,首先从normal队列入手,然后再从return队列找,他将找到size最符合且地址在空闲Span中最小的Span,然后切出来返回。
9 如果large_队列中都没有找到合适的Span,那么将通过GrowHeap增长Heap的方式,通过TCMalloc_SystemAlloc向系统申请内存。并包装成Span,并插入heap中,然后再次进行分配。
10、来到此处代表分配的内存是大于32k的,那么将向heap直接请求跳到第7步。
- TCMalloc的使用与源码剖析之六---------TCMalloc中内存分配流程
- TCMalloc的使用与源码剖析之七---------TCMalloc中内存释放流程
- TCMalloc的使用与源码剖析之二---------TCMalloc内存分配与管理简述
- TCMalloc的使用与源码剖析之三---------TCMalloc的内存分配的主要层次
- TCMalloc的使用与源码剖析之八---------TCMalloc内存分配与释放的管理之内存泄露检查
- TCMalloc的使用与源码剖析之五---------TCMalloc中涉及到的几个重要的数据结构
- TCMalloc的使用与源码剖析之十--------TCMalloc与APR,ptmalloc的分析比较
- TCMalloc的使用与源码剖析之四---------内存在各层之间的传递
- TCMalloc的使用与源码剖析之一---------TCMalloc 安装和使用
- TCMalloc的使用与源码剖析之九---------一些未解决的问题
- 使用TCMalloc可选择使用内存分配程序
- go语言内存分配之TCMalloc
- Redis使用TCMalloc提高内存分配性能
- 内存分配器之TCMalloc
- tcmalloc安装与使用
- tcmalloc安装与使用
- TcMalloc库的使用
- 记一次tcmalloc分配内存引起的coredump
- C# 解决多类型大数据量数据文件的延迟性
- 用户登录与注册表单验证代码
- kafka 初学搭建
- MySQL添加/删除主键、外键、唯一键、索引、自增
- select查询返回值类型和返回空类型是not in和exists的区别
- TCMalloc的使用与源码剖析之六---------TCMalloc中内存分配流程
- 前缀++ 和 后缀 ++ 的深刻理解
- 数据类型之枚举
- 工作已定 结束招聘季的奔波
- NOIP初赛准备:第6课时
- 使用pandas.read_csv()中文乱码问题
- codeforces - E. Devu and Flowers & LightOJ 1124 Cricket Ranking(容斥定理+lucas定理)
- 微信公众平台开发(十二) 发送客服消息
- NOIP初赛准备第7课时