免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
楼主: duanjigang
打印 上一主题 下一主题

发个简单(易用)的内存池 [复制链接]

论坛徽章:
0
21 [报告]
发表于 2010-01-12 18:00 |只看该作者
原帖由 libra811 于 2010-1-12 16:30 发表
在init_mem_list函数里的第一次分配的话 ,是不是应该要添加一行代码:
  if(!plist->list)
        {
            plist->list = p;
            plist->list->next = p;//添加代码。否则在第二次循环时候 ...

p是循环中的一个临时变量,这个分配的原则是如果链表头空,就把当前新节点给链表头。
如果不空,就把新节点加入到链表头和后续节点之间。
您这句似乎没有必要,呵呵,也看不懂这样写的意图:wink:

论坛徽章:
0
22 [报告]
发表于 2010-01-12 22:25 |只看该作者
说是“简单”,但还是不大明白……

论坛徽章:
0
23 [报告]
发表于 2010-01-13 10:30 |只看该作者
原帖由 flydream81 于 2010-1-12 22:25 发表
说是“简单”,但还是不大明白……

呵呵,是目的不明白还是实现不明白?

目的是:
初始化时申请足够用的内存,然后运行时根据用户需求,调用申请接口时,就分配一个该类型的节点,也就是一个该类型的变量。
用户释放时,就把该节点放入内存池。为了省去频繁的malloc和free操作,提高内存分配和回收的效率。
实现方法:
首先从一个类型说起,一个类型的类存储就是一个双向链表,这个链表构成了一个栈,初始化时,初始化N个该类型的节点,挂在该链表下。链表每个节点下面挂一个节点,链表头在栈尾部,链表尾在栈顶部。
       每次申请节点时,把链表尾的节点摘下来返回给用户,然后弹栈,也就是链表尾指针往前移动一个位置。
如果尾巴和头相等,则说明节点分配完了。
        每次回收节点时,先把链表尾往移动一个位置,然后把回收的节点挂在链表尾上。

对于多个不同的类型,我们用了一个栈列表,或者说数组,数组每个元素就是一个类型的链表或者栈。

类型我们定义为0到255,用一个u_int8_t的变量标识。
进行申请时,根据类型值直接哈希到数组的对应链表上。
回收时,先根据节点地址,计算它的类型值,然后再哈希回去。---因为我们在分配内存时,刻意为每个节点多申请了一个字节,用这个字节存储类型值,这样回收就快了

不知道说清楚没有,呵呵
对了,我放上了图,应该比较清晰了

[ 本帖最后由 duanjigang 于 2010-1-13 10:55 编辑 ]

论坛徽章:
0
24 [报告]
发表于 2010-01-13 13:07 |只看该作者
使用 spin_lock和spin_lock_bh的区别可以参考albcamus发表的精华文章
http://linux.chinaunix.net/bbs/viewthread.php?tid=656347&extra=page%3D3%26amp%3Bfilter%3Ddigest

我记得最后有个表的,很有用,可惜现在下不了附件,可以去网上搜搜

[ 本帖最后由 thomas_ar 于 2010-1-13 13:09 编辑 ]

论坛徽章:
0
25 [报告]
发表于 2010-01-13 16:33 |只看该作者
难道最近所有的附件都看不到?这是怎么一回事  ???

论坛徽章:
0
26 [报告]
发表于 2010-01-14 21:32 |只看该作者
附件统统看不到:em11: :em11: :em11:

论坛徽章:
3
金牛座
日期:2014-06-14 22:04:062015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:49:45
27 [报告]
发表于 2010-01-15 12:07 |只看该作者
最近这个附件审核好严格!

论坛徽章:
36
IT运维版块每日发帖之星
日期:2016-04-10 06:20:00IT运维版块每日发帖之星
日期:2016-04-16 06:20:0015-16赛季CBA联赛之广东
日期:2016-04-16 19:59:32IT运维版块每日发帖之星
日期:2016-04-18 06:20:00IT运维版块每日发帖之星
日期:2016-04-19 06:20:00每日论坛发贴之星
日期:2016-04-19 06:20:00IT运维版块每日发帖之星
日期:2016-04-25 06:20:00IT运维版块每日发帖之星
日期:2016-05-06 06:20:00IT运维版块每日发帖之星
日期:2016-05-08 06:20:00IT运维版块每日发帖之星
日期:2016-05-13 06:20:00IT运维版块每日发帖之星
日期:2016-05-28 06:20:00每日论坛发贴之星
日期:2016-05-28 06:20:00
28 [报告]
发表于 2010-01-15 13:05 |只看该作者
好像是论坛在调整,估计还没有结束

论坛徽章:
0
29 [报告]
发表于 2010-01-16 10:24 |只看该作者
原帖由 ubuntuer 于 2010-1-11 23:33 发表
我看到的附件都是审核中  谢谢分享
不过我记得好像sourceforge有个不错的内存池的^_^

http://sourceforge.net/projects/mempool/

这个是在应用层实现的,貌似是国内的同志写的.

[ 本帖最后由 osmanthusgfy 于 2010-1-16 10:28 编辑 ]

论坛徽章:
3
天蝎座
日期:2014-10-25 13:44:312015年辞旧岁徽章
日期:2015-03-03 16:54:152015年迎新春徽章
日期:2015-03-04 09:48:31
30 [报告]
发表于 2010-01-16 14:16 |只看该作者
问个问题,

如果有指针非法重复释放/内存泄露,

这个内存池能否提供额外的定位信息?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP