免费注册 查看新帖 |

ChinaUnix.net

  平台 论坛 博客 文库 频道自动化运维 虚拟化 储存备份 C/C++ PHP MySQL 嵌入式 Linux系统
最近访问板块 发新帖
楼主: duanjigang

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

论坛徽章:
0
发表于 2010-01-12 16:30 |显示全部楼层

回复 #1 duanjigang 的帖子

在init_mem_list函数里的第一次分配的话 ,是不是应该要添加一行代码:
  if(!plist->list)
        {
            plist->list = p;
            plist->list->next = p;//添加代码。否则在第二次循环时候的p->next指针为空,与第一次分配的不能形成链表
            plist->ptr = p;
            continue;
        }

论坛徽章:
0
发表于 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
发表于 2010-01-12 22:25 |显示全部楼层
说是“简单”,但还是不大明白……

论坛徽章:
0
发表于 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
发表于 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
发表于 2010-01-13 16:33 |显示全部楼层
难道最近所有的附件都看不到?这是怎么一回事  ???

论坛徽章:
0
发表于 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
发表于 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
发表于 2010-01-15 13:05 |显示全部楼层
好像是论坛在调整,估计还没有结束

论坛徽章:
0
发表于 2010-01-16 10:24 |显示全部楼层
原帖由 ubuntuer 于 2010-1-11 23:33 发表
我看到的附件都是审核中  谢谢分享
不过我记得好像sourceforge有个不错的内存池的^_^

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

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

[ 本帖最后由 osmanthusgfy 于 2010-1-16 10:28 编辑 ]
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

数据风云,十年变迁
DTCC 第十届中国数据库技术大会已启航!

2019年5月8日~5月10日,由IT168旗下ITPUB企业社区平台主办的第十届中国数据库技术大会(DTCC2019),将在北京隆重召开。大会将邀请百余位行业专家,就热点技术话题进行分享,是广大数据领域从业人士的又一次年度盛会和交流平台。与SACC2018类似,本届大会将采用“3+2”模式:3天传统技术演讲+2天深度主题培训。大会不仅提供超100场的主题演讲,还会提供连续2天的深度课程培训,深化数据领域的项目落地实践方案。
DTCC2019,一场值得期待的数据技术盛会,殷切地希望您报名参与!

活动入口>>
  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP