一个简单内存池实现

    最近面试被问了一个内存池的实现,关键是内存块的组织,说来惭愧,由于之前没有详细去了解过实现,只记得操作系统上有说过空闲链表的实现,即按分配的块用链表链接,有小块优先,大块优先等~~~~
    后来回来认真地找了几个内存池实现的技术介绍,多数是以一个固定块,每个块又有固定长度的单元组成。参考了网上的一些实现方法,实现了这个简单的内存池,测试了一下,效果还可以呵呵~~~

 

(注意如果要加大测试量,要加入栈空间以防栈溢出)

 

 

 

      虽然是实现了,但还是对内存池的一些疑问~~小于块长度的内存分配请求会浪费空间(因为第次alloc会分配一个固定长度内存单元,方便回收),大于块长度的请求,又要用多块拼接而成。然而拼接的方法是个很大问题,如果设计为连续内存块,会有很严重的空洞问题;如果设计成链表结构,所有和这段信息相关的处理函数就都需要支持这种链表,否则就会引入额外的内存拷贝。

 

内存池补充资料:

1. 可以有固定分区分配(分配方法如字面意思,不再累述)
可变分区分配:为进程分配的空间是可变的(依照需要变化),其中又有几种不同的具体分配方法如:
最佳适应算法:进程退出后返还占用的内存,但是会产生不连续的内存,就像磁盘碎片一样。最佳适应算法就是从剩下的内存中找到一块大小最合适(不一定和需要的一样大,但必须>=需要的大小)的分配给进程,当然只分配进程需要的大小而那一块中剩下的部分(如果还有剩下)依然空闲。
首次适应算法:从头开始进行匹配,当第一次找到>=需要大小的内存块就进行分配。
循环首次适应算法:和首次适应差不多,只不过他不从头开始匹配,他是从当前的下一块内存开始匹配。
每种分配方法都有自己的优点和缺点,应当视具体情况选择。

 

2.http://www.ibm.com/developerworks/cn/linux/l-cn-ppp/index6.html

 

3.论坛上的一些回答

(1)大块内存要怎么分配好呢?还是直接用系统分配实现?
个人认为大块内存直接用系统分配实现更好,用内存池的话多了很多 步骤

(2)大家能否介绍一下工作中用到内存池地方,以及带来的性能效应怎么样呢?
个人觉得内存池多用在那些内存块比较小,而且经常分配释放频率比较高的时候。因为如果是大块内存的使用用内存池效率不好!!还有就是如果是小块的内存如果经常需要分配和释放的话,用内存池效率比较快

 

4.测试数据

DEBUG:

System new( 10000000 ) time:2281
System delete( 10000000 ) time:4141
memPool alloc( 10000000 ) time:812
memPool free( 10000000 ) time:594

RELEASE:

System new( 10000000 ) time:1032
System delete( 10000000 ) time:1218
memPool alloc( 10000000 ) time:407
memPool free( 10000000 ) time:250

 

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值