整体介绍
malloc目的就是在堆中申请一片大小为size的空间,下面会描述CASPP中介绍的几种方法以及一些其他方式,首先我们可以看一下一个进程虚拟内存的结构。
use stack |
Free area |
memory-mapped region for shared libraries |
Free area |
heap |
.bss |
.data |
.text |
Free area |
1.Implicit Free List
首先看一下每块的结构
Size | Allocate/Free |
payload and padding | |
Size | Allocate/Free |
2.Explicit Free Lists
还是先看每块结构
Size | Allocate/Free |
payload and padding | |
Size | Allocate/Free |
Size | Allocate/Free |
Pre | |
Next | |
padding | |
Size | Allocate/Free |
该结构和implicit中结构类似,但是多了指向前空闲块和后空闲块的指针,这样就不需要再遍历已经被使用的块了,从空间占用来看,管理的最小要是16字节。
3.Segregated free list
块结构和上面Explicit并没有什么区别,其改进在于按照块大小分为多个链表,类似stl中分配器的实现。
4.Red-Black Tree
可以使用红黑树(红黑树插入删除不在此介绍)来进行内存管理,其结构在Explicit上增加指向父节点的指针,增加查找效率,其空间占用应为24。
5.分配和合并
对于分配而言有着两种方式,一种是首次匹配(即找到就分配,容易出现碎片),一种是最优匹配(每次都找最合适的)。合并即每次free需要检查前后是否也为空闲即能合并为大块。
6.整合
可以将大小进行分类,为8的通过implicit来进行管理,16的通过explicit管理。其余通过red-black tree管理。