免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
12下一页
最近访问板块 发新帖
查看: 6468 | 回复: 12
打印 上一主题 下一主题

[算法] 实现了一个大小内存管理程序 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2011-08-25 21:06 |只看该作者 |倒序浏览
最近闲来无事,做了一个内存管理的程序,实现大小内存的申请和批量释放, 主要是为了解决小内存申请时的产生内存碎片的问题。
    大体做法如下:申请一个内存池,然后在该内存池申请大内存和小内存;小内存直接在内存池的存储区域存放;大内存则要先自动产生一个内存头,然后在其它地方分配内存,内存头也存放在内存池的存储区域内。
   
    参照以下资料做的:http://www.tbdata.org/archives/1390

论坛徽章:
0
2 [报告]
发表于 2011-08-26 11:24 |只看该作者
不知道lz实现的内存池的小对象的内存大小界界限是多少?128字节吗?

我读过sgi stl 的内存池,觉得非常短小精悍,lz可以看看参考一下。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
3 [报告]
发表于 2011-08-26 12:02 |只看该作者
不知道lz实现的内存池的小对象的内存大小界界限是多少?128字节吗?

我读过sgi stl 的内存池,觉得非常短 ...
ydfgic 发表于 2011-08-26 11:24


现在觉得此类普适性的内存池简直一点用也没有, sdi stl 的内存池算法估计malloc/new 自己的实现就干了, 根本用不着再做一次。
觉得只有 slab 适用时, 做自己的缓存才有点意义

论坛徽章:
0
4 [报告]
发表于 2011-08-26 13:09 |只看该作者
现在觉得此类普适性的内存池简直一点用也没有, sdi stl 的内存池算法估计malloc/new 自己的实现就干了 ...
zylthinking 发表于 2011-08-26 12:02



    此言差矣,sgi stl对小于128字节的小内存是有很高效的内存池算法的。
malloc 的效率低是公认了的,特别是多线程环境,要不哪用出那么多内存池的。
我常用的内存池是 sgi stl,boost::pool, TCMalloc,各有千秋。
对象内存池上面三个也都有实现。

论坛徽章:
0
5 [报告]
发表于 2011-08-26 13:12 |只看该作者
我是一直没觉得内存分配效率不够高的

估计咱做的都是小项目吧。。。

论坛徽章:
0
6 [报告]
发表于 2011-08-26 13:54 |只看该作者
顺序存取速度永远是最快的。不知道楼主想解决什么问题,不同的问题有不同的解决办法。例如,是想读得快,还是想写得快,还是想纯粹不产生内存碎片?

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
7 [报告]
发表于 2011-08-26 15:03 |只看该作者
此言差矣,sgi stl对小于128字节的小内存是有很高效的内存池算法的。
malloc 的效率低是公认了的 ...
ydfgic 发表于 2011-08-26 13:09


malloc 的效率是谁公认低了?
sgi stl 内存池自然有其优点, 但毛病也不小
1。 无法处理大块内存申请吧, 如果处理大块内存申请, 要么内存块的跨度必须大, 就是浪费内存;  要么要求链表数量足够多, 如果链表数量足够多, 循环又要多了(分配2, 结果该链表没有, 去4的里面找, 也没有, 去6的链表找, 再没有。。。。)
2。 无法内存回收吧, 除非它再加上buddy 系统, 可是至少sgi stl 没有; 它就是一个动态平衡算法, 适应的峰值不高的应用, 如果一瞬间要求2G的内存, 然后剩下的1个月, 只要求1M的内存, 它的表现不咋地

* Why use this malloc?
0042

0043
  This is not the fastest, most space-conserving, most portable, or
0044
  most tunable malloc ever written. However it is among the fastest
0045
  while also being among the most space-conserving, portable and tunable.
0046
  Consistent balance across these factors results in a good general-purpose
0047
  allocator for malloc-intensive programs.

0048

0049
  The main properties of the algorithms are:
0050
  * For large (>= 512 bytes) requests, it is a pure best-fit allocator,
0051
    with ties normally decided via FIFO (i.e. least recently used).
0052
  * For small (<= 64 bytes by default) requests, it is a caching
0053
    allocator, that maintains pools of quickly recycled chunks. 这个是不是sgi stl 的基本手法???

0054
  * In between, and for combinations of large and small requests, it does
0055
    the best it can trying to meet both goals at once.
0056
  * For very large requests (>= 128KB by default), it relies on system
0057
    memory mapping facilities, if supported.
0058

论坛徽章:
0
8 [报告]
发表于 2011-08-26 20:01 |只看该作者
回复 7# zylthinking


    你说得两点只说对了一半。
sgi stl 的分配是按照 8字节为单位,圆整到8的倍数,当申请字节数小于128时,有这16个链表。
申请2,4,6,8都是在8字节的链表里找节点的。如果8字节的不够,向16字节的链表要内存,分割成两个8字节。如果16也没有再向24字节要,以此类推到128字节。如果超过了128字节字节调用malloc 返回。
同理释放也是大于128字节的直接free了。
那么会存在申请的内存是不会释放的,但是对大于128字节的是会free掉的。

malloc的问题是分配还是比较快,但是它的回收算法包含了合并内存块,是比较慢的,所以才有那么多自己实现的内存池。
另外多线程环境是很慢(因为无缓存,一个大锁进行保护)。可以看TCMALLOC的测试结果。

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
9 [报告]
发表于 2011-08-27 00:12 |只看该作者
回复  zylthinking


    你说得两点只说对了一半。
sgi stl 的分配是按照 8字节为单位,圆整到8的倍数 ...
ydfgic 发表于 2011-08-26 20:01


我走个大概意思, 你倒是斤斤计较是2还是8了

论坛徽章:
11
未羊
日期:2013-12-16 12:45:4615-16赛季CBA联赛之青岛
日期:2016-04-11 19:17:4715-16赛季CBA联赛之广夏
日期:2016-04-06 16:34:012015亚冠之卡尔希纳萨夫
日期:2015-11-10 10:04:522015亚冠之大阪钢巴
日期:2015-07-30 18:29:402015亚冠之城南
日期:2015-06-15 17:56:392015亚冠之卡尔希纳萨夫
日期:2015-05-15 15:19:272015亚冠之山东鲁能
日期:2015-05-14 12:38:13金牛座
日期:2014-12-04 15:34:06子鼠
日期:2014-10-16 13:40:4715-16赛季CBA联赛之八一
日期:2016-07-22 09:41:40
10 [报告]
发表于 2011-08-27 00:19 |只看该作者
本帖最后由 zylthinking 于 2011-08-27 00:34 编辑
回复  zylthinking
malloc的问题是分配还是比较快,但是它的回收算法包含了合并内存块,是比较慢的,所以才有那么多自己实现的内存池。
另外多线程环境是很慢(因为无缓存,一个大锁进行保护)。可以看TCMALLOC的测试结果。
ydfgic 发表于 2011-08-26 20:01


best fit 会合并内存块吗? 有些拿不准了。。。。。。如果那样, 还best fit 什么啊, 直接挖chunk就行了
多线程问题不是很清楚, 但很显然, 无缓存和有锁没直接关系, sgi stl就没有锁了?
还有, 没有缓存, 那合并内存块从何说起?
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

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

清除 Cookies - ChinaUnix - Archiver - WAP - TOP