动态分配
本篇开始说一个耳朵听起老茧的概念 动态分配,将分成上下两篇,本篇为上篇,看完能快速理解下篇鸿蒙内核源码对动态内存的具体实现。
- 鸿蒙内核源码分析(TLFS算法) 结合图表从理论视角说清楚 TLFS 算法
- 鸿蒙内核源码分析(内存池管理) 结合源码说清楚鸿蒙内核动态内存池实现过程,个人认为这部分代码很精彩,简洁高效,尤其对空闲节点和已使用节点的实现令人称奇。
TLFS 原理
TLSF(Two-Level Segregate Fit) 是一种用于实时操作系统的内存分配算法,用两级结构对空闲块按大小进行划分,采用两级链表/索引的方式来加快查找。
把上图看懂基本能明白 TLFS 的原理,请尝试自己先理解一遍再看本篇。
解读
- 为方便理解 ,将上图做成(表一),中间过程请查看图表变化
-
右边为第一级链表
First List
(简称fl
)。将空闲内存块的大小根据2
的幂进行分类,如(32、64、128、…), 这跟伙伴算法很类似,伙伴算法是物理内存的分配算法,这样做的好处是防止外部碎片化,是否空闲用位图标识 FL_bitmap | 一维数组,0011
代表[32-64]、[64-128]
这个区间有内存可以申请,例如: malloc(37) 时,查到在区间[32-64]
中,为1
代表本次可能可以申请到内存,但具体行不行得进入第二级查看。 -
中间为第二级链表
Second List
(简称sl
)。第二层链表在第一层的基础上,按照一定的间隔,线性分段,图中将其分成8
等份,对于[32-64]
来说1/8
为4
,对于[64 - 128]
来说1/8
为8
,可以确定的是等份也是2
的倍数,同样是否空闲用位图标识SL_bitmaps[] | 二维数组 ,每个bit代表是否空闲,图中代表[36 - 39]
有内存可供分配,再查看其空闲链表发现真正可供分配的空间有两块,38 和 36
,自然将38
给 malloc(37) 返回,此时空闲链表中还剩36
节点 ,所以 一二