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

Posted ouyangbuxiu

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了内存管理基本技术之:块头相关的知识,希望对你有一定的参考价值。

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

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

@内容摘要:块头指用来记录内存管理相关信息的内存块,通常位于普通内存块的头部和尾部。@
,版权归vtzone研究小组所有,转载请保持此声明!!!

块头 大多数分配器在每一块头保存一些有用信息,更准确的说是保存快的大小。因为大多数标准分配器<比如CLib>释放内存时并不要求应用传递一个大小信息。




块头1.JPG (6.02 KB)
2007-12-1 14:02



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

 


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


 



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




块头2.JPG (4.79 KB)
2007-12-1 14:02



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


作者:vt.buxiu@www.vtzone.org 

 

复制内容到剪贴板
代码:

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);

以上是关于内存管理基本技术之:块头的主要内容,如果未能解决你的问题,请参考以下文章

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

MySQL——innodb日志管理

让假照片原形毕露?今日水印相机上线“照片验真”功能

为啥 dlmalloc 分配的块头包含 4 个字节的先前分配的块 [关闭]

linux中使用了啥内存管理方法,为啥

前端通用框架可行性研究报告之弹窗