摘要: 内存池是种用于分配大量大小相同的小块内存的技术,可以极大加快内存分配/释放过程.MemPool技术的内存分配,释放速度非常快,达到O(1)级别.缺点:1).只能分配特定字节长度的内存,也就是说,MemPool不是通用内存管理器.2).MemPool技术可能导致内存占用只增不减.基本实现如下:其中指针变量MemBlockHeader把所有申请的内存块(MemBlock)串成一个链表,以便通过它可以释放所有申请的内存.FreeNodeHeader变量则是把所有自由内存结点(FreeNode)串成一个链表.内存块大小一般固定为MemBlockSize字节(除去用以建立链表的指针外).内存块在申请之初 阅读全文
posted @ 2012-06-05 23:05 一点心青 阅读(2253) 评论(0) 推荐(0) 编辑
摘要: 下面主要介绍STL中实现的内存空间配置器.关键点:1).考虑到小型区块所可能造成的内存破碎问题,设计了双层级配置器.当配置区块超过128bytes时,调用第一层级配置器,第一层级配置器直接使用malloc()和free().当配置区块小于128bytes时,调用第二层级配置器,采用复杂的memory pool整理方式,降低额外开销.2).内存池管理方式是每次配置一大块内存,并维护对应之自由链表.若有相同大小的内存分配,就直接从自由链表中分配内存块.若内存释放时,则由配置器回收到自由链表中.第二级配置器会主动将任何小额区块的内存需求量调至8的倍数.3).自由链表(free-list)节点的结构如 阅读全文
posted @ 2012-06-05 19:29 一点心青 阅读(1224) 评论(0) 推荐(1) 编辑
摘要: 构造一个动态内存分器的设计空间很大,有多种块格式,空闲链表格式,以及放置,分割和合并策略可供选择.下面介绍的方法中,使用了隐式空闲链表和立即边界标记合并方式.总体思想:首先用malloc申请一大段内存空间,将这段内存空间看作整块的内存;内存分配算法采用了最简单的第一次匹配算法,即在第一次遇到满足请求的未使用的内存区域立刻分配给请求;内存释放时,根据内存区域的头域和尾域标识的分配情况进行合并处理.使用的堆块格式如下图所示:使用的隐式空闲链表格式如下图所示:操作空闲链表的基本常数和宏全局变量:主要的内部函数:外部接口函数:其中,内存释放时,合并可能出现的四种情况如下图所示:参考资料:深入理解计算机 阅读全文
posted @ 2012-06-05 13:06 一点心青 阅读(316) 评论(0) 推荐(0) 编辑
摘要: 分配程序的全局变量分配程序的初始化函数sbrk()函数,用于动态增加内存空间.char *sbrk(int incr) incr为增加的字节数.内存控制块结构分配程序的释放函数分配程序的分配函数指针间的图示效果如下:mem_alloc_ptr为malloc()函数返回的可用区间指针.思考点:1).内存分配的底层编程主要技巧是强制类型的转换,以及一些指针间操作,进行编程实现时,需要画清相应示意图.2).该方法中,使用4字节来标识内存是否可用,有点浪费.3).该方法中,内存释放时,没有内存合并,将会产生许多内存碎片.4).该方法中,内存分配时,在最坏的情况下,需要遍历所有的内存块,效率低下.参考资 阅读全文
posted @ 2012-06-05 10:18 一点心青 阅读(308) 评论(0) 推荐(0) 编辑