内存管理基本技术之:块头

内存管理基本技术之:块头

版权声明:
    本文章由vt.buxiu发布在www.vtzone.org

@内容摘要:块头指用来记录内存管理相关信息的内存块,通常位于普通内存块的头部和尾部。@,版权归vtzone研究小组所有,转载请保持此声明!!!
块头 大多数分配器在每一块头保存一些有用信息,更准确的说是保存快的大小。因为大多数标准分配器<比如CLib>释放内存时并不要求应用传递一个大小信息。







上图的块头的应用是一个最简单而用常用的用法,假定内存分配器提供两个函数mymalloc和myfree,这两个函数原形与C标准库的malloc和free相同:
应用程序每次向分配器请求内存的时候,分配器将一块内存block返回给应用程序,同时在其头部维护一个header

 


由于当应用调用free(void* address)时候并未指定释放的大小,分配器由free指定的地址向前偏移一个header大小就能够获取保存在header中的该内存块的size信息。


 



其他一些信息,比如,块是否被使用,与相邻块之间的关系等也可能保存在头部。如下图则是由Knuth提出的边界标记算法中使用的,该内存块保存了两个信息:块头和块尾,而头合尾分别保存了内存块的大小和是否被占用标志。保存这些块头信息是为了快速的进行分配和释放操作。







关于上图的具体应用以及代码示例请参考 < 边界标记>
需要明确的是,头块很方便但浪费空间,当小对象请求时表现更加明显。根据[WJNB95],应用程序请求内存的平均大小为10Bytes,如果这个假设成立,每个块头如果占用4Bytes,使用一个块头的内存管理则造成4/10的内存浪费。当然如果使用的块头不是4bytes或者更大浪费则更多。当然10bytes只是一个平均值,对于特定的应用程序,可以评估自己特定应用的平均请求的内存块的大小而做出抉择。


作者:[email protected] 

 

复制内容到剪贴板
代码:

void myfree(void* p)
{
          void* pointer = (char*)p – sizeof(Header);
          return free(pointer);
}

 

复制内容到剪贴板
代码:

typedef unsigned long Header;
void* mymalloc (size_t size)
{
          void* mem = malloc(size + sizeof(Header));
          *((Header*)mem) = size;
          return (char*)mem + sizeof(Header);
}

你可能感兴趣的:(c,算法,header)