刚刚写完malloc的小伙伴估计现在还心有余悸~ 不过写完以后在看书,你会发现书上的东西很简单。
转载请注明出处:http://blog.csdn.net/c602273091/article/details/53576494
介绍
动态内存分配:在程序运行时给相应变量分配内存。因为在很多时候我们只有在运行的时候才知道内存,提前分配要么就会太大,浪费了空间;要么就是太小,信息存放不下。动态内存是存在于堆空间上的。
动态内存分配器分为显式和隐式,并且在管理的时候把内存分成固定的块。显示的如malloc,new,需要自己申请和释放。隐式的如java中的垃圾回收。
在内存中,动态内存分配区域如下:
在进行malloc内存分配的时候,内部(分配给一个比payload更大的区域存放所需数据,一般是为了满足对齐要求,保留该块的一个数据结构)和外部碎片(本来可以满足请求,但是因为不连续)会降低utilization。
对于空闲链表的维护,可以使用implicit list, explicit list, segregated list, balance tree(red black tree)进行记录。下面就介绍这些链表。
空闲链表
implicit list
隐式链表就是说它没有显式地使用指针,但是可以向链表一样找到下一个节点。这个结构就是有一个头部,头部说明这个块的大小以及是否已经分配。接着是payload,然后是对齐的pending。当然这里没有画出footer,用于合并。