基于MCB的内存管理算法
基于这个算法,整个堆的分配和回收由一个链表来控制。这个链表的每个节点由一个MCB块和一块内存块组成。这个MCB链描述了所有所有内存块的使用状况。
MCB块的结构如下:
typedef struct St_MemControlBlock
{
struct St_MemControlBlock * pNext;
unsigned nLimit;
unsigned uSignature;
}St_MemControlBlock;
当系统初始化的时候,整个堆就是MCB链的第一个节点。这个节点的MCB块是一个空闲块,描述了整个堆的大小。
当一块内存被分配的时候,malloc函数会搜索这个MCB链,试图找到一个足够大的空闲块。如果没有找到,就返回NULL。如果找到,则通过MCB检查空闲块的大小。如果这个空闲块的大小等于需要分配的内存大小,则把这个空闲块标为使用状态,并把这个节点MCB块后的内存地址作为首地址返回。如果这个空闲块的大小大于需要分配的内存大小,则分拆这个块为两个节点。把第一个节点标为使用状态,把第二个节点标为空闲状态。然后,返回第一个节点MCB块后的内存地址。
为加快分配速度,可以对一些分配特征进行优化。例如,可以对堆栈方式(先分配后释放)的分配使用进行优化。
当一块内存被释放时,free函数把这个内存块标为空闲状态。如果这个内存块和一个空闲块相邻,free函数将合并这两个空闲块为一个块。