内存池设计
题目:频繁的内存操作new,delete是比较耗时的操作,为了减少这些操作,一般都会设计自己的内存分配器。一个程序需要频繁使用大小在512Byte到200KByte不定长的内存,请您设计一个高效的内存分配器?
考虑设计的重要关注点和大致思路,空间使用率等。
一、结构:
1) 首先假设内存分配器的最小内存分配单元为mem_unit,需要确定最小分配单元的大小。如果设置太小,将使得内存单元过于琐碎,过大则造成空间浪费。基于这个考虑,设置多个大小类别的mem_unit。申请内存单元时,将分配能够满足该大小的最小内存单元。
2) 由于同一类别的mem_unit是随机申请的,空间不连续,所以采用单向链表结构管理同一类别的mem_unit。
3) 为了能够快速定位某一个类别的men_unit_list, 通过对men_unit的size进行hash建立索引。
基于以上三点考虑,建立的内存分配器结构如下图:
二、流程
1) 申请内存
根据申请内存的大小选择合适的mem_unit, 若相应的mem_unit_list为NULL,则向操作系统申请内存空间,然后构建mem_unit进行分配;若mem_unit_list不为NULL,则从中取出mem_unit进行分配。
2) 释放内存
将men_unit添加到相应的mem_list中。
三、总结
1) 申请内存时间复杂度为O(1),释放内存时间复杂度为O(1);
2) 存在空间浪费,单个mem_unit最大浪费4KB;
3) 只申请内存不释放,因此对于内存波动大的应用空间浪费会比较严重;
4) 多线程应用时,每个mem_unit_list必须是线程安全的。