空间配置器
空间配置器,就是用来配置、管理和释放空间的,给所有的容器包括算法提供生存空间。
作用
- 提高代码复用率,功能模块化;
- 减少内存碎片问题;
- 提高内存分配的效率;
- 有内存不足时的应对措施;
- 隐藏实际中对存储空间的分配及释放细节,确保所有被分配的存储空间都最终获得释放;
- 考虑多线程状态。
策略
用户申请空间大于128?
yes:调用一级空间配置器
no:调用二级空间配置器
一级空间配置器
一级空间配置器直接封装malloc
,free
进行处理,增加了C++中的set_handler
机制(这里其实也就是个略显牵强的装饰/适配模式了),增加内存分配时客户端可选处理机制。
实现原理
Allocate用于分配空间,如果申请失败,用oom_alloc重新尝试申请。
Deallocate用于释放空间。
Reallocate用于根据需要自己调整已经存在的空间大小,如果申请调整失败,用oom_realloc尝试申请。
二级空间配置器
二级配置器使用内存池+自由链表的形式避免了小块内存带来的碎片化,提高了分配的效率,提高了利用率。
它是用一个16个元素的自由链表(free_list)来管理的,每个位置的内存大小都是8的倍数,分别为:8、16、24、32、40、48、56、64、72、80、88、96、104、112、120、128。
基本过程
用户申请空间->检查链表中是否挂有空闲节点?
是:取走返回,Allocate()
否:自由链表向内存池申请节点Refill()
内存池是否有足够空间?Chunk()
是:取内存连接到链表,返回一个给用户
否:malloc补充内存池,逐级返回malloc
二级配置器实现了对小内存的高效管理,使内部碎片出现的概率大大降低。