首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ >

大伙都用过什么内存池

2012-07-05 
大家都用过什么内存池?我以前做过的项目对稳定性有很高的要求,又用到了STL,boost,所以用过的内存池都有all

大家都用过什么内存池?
我以前做过的项目对稳定性有很高的要求,又用到了STL,boost,所以用过的内存池都有allocator的功能。最开始用过boost::pool_allocator,但是那个效率实在不敢恭维,某些代码的效率只有默认allocator的1/300,即使优化也很难赶上默认allocator的速度。后来我自己写了一个,效率虽然上去了,但还是有很多不完善的地方。最近我发现glibc++的一些内存池相当好用,内存分配原理也相当优秀。
大家都用过哪些内存池?

[解决办法]
都是自己实现的.
[解决办法]
又不是什么高级技术, 实现方法都一样.

把握一个概念:

内存池就是内存, 内存管理器才是操作内存池的接口, 你要实现的是内存管理器, 不是内存池, 内存池malloc上几百兆就叫做内存池了。
[解决办法]

探讨

引用:

又不是什么高级技术, 实现方法都一样.



这一点我不太同意,有一些内存池的实现原理比你说的要复杂。比如一种多线程内存池模型,首先有一个全局的内存池,然后每个线程都有自己的内存池。如果线程没有空闲的内存池会向全局内存池划分空间,这样就有了一个所有权问题。到了释放内存的时候,如果线程内存池空闲太多,就有一部分必须归还全局内存池。这样整个设计下来效率还不能低……

[解决办法]
探讨

引用:

引用:

又不是什么高级技术, 实现方法都一样.



这一点我不太同意,有一些内存池的实现原理比你说的要复杂。比如一种多线程内存池模型,首先有一个全局的内存池,然后每个线程都有自己的内存池。如果线程没有空闲的内存池会向全局内存池划分空间,这样就有了一个所有权问题。到了释放内存的时候,如果线程内存池空闲太多,就有一部分必须归还全局内存……

[解决办法]
探讨

引用:
楼主貌似把程序全局唯一的内存池,和应用程序不同地方创建的内存管理器混淆了,概念理不清恐怕影响你对这些东西的认识。


我没有混淆,线程内存池是从全局内存池划分出来的,用户不能直接使用全局内存池,只能使用线程内存池,这样设计是为了合理划分每个线程的资源。

[解决办法]
探讨

引用:
楼主貌似把程序全局唯一的内存池,和应用程序不同地方创建的内存管理器混淆了,概念理不清恐怕影响你对这些东西的认识。


我没有混淆,线程内存池是从全局内存池划分出来的,用户不能直接使用全局内存池,只能使用线程内存池,这样设计是为了合理划分每个线程的资源。

[解决办法]
井底之蛙是这样的: 他们不会的, 就认为别人都不可能会, 他们认为高级的, 就认为别人都应该理解不了. 

你要是这种心态, 干脆结贴行了, 山外有山, 你要觉得你链接里用了个MT两个关键字就能超神, 略显幼稚了.

回你帖是因为在这方面看的挺多, 自己也有所总结, 你要是觉得别人都是放屁, 你也不必来问大家, 不是吗?
[解决办法]
你给我的感觉就是, 你从来没有看过一个内存池实现, 你也没到一个高度, 那个高度的世界里, 你不是为了代码而效率, 而是为了效率而代码.
[解决办法]
探讨

引用:
楼主貌似把程序全局唯一的内存池,和应用程序不同地方创建的内存管理器混淆了,概念理不清恐怕影响你对这些东西的认识。


我没有混淆,线程内存池是从全局内存池划分出来的,用户不能直接使用全局内存池,只能使用线程内存池,这样设计是为了合理划分每个线程的资源。

[解决办法]
不懂,围观学习大牛
[解决办法]
内存池网上很多吧,楼主搜下呗
各位给的答案也不错
[解决办法]
不懂的路过····
[解决办法]
tc_malloc,开源的
[解决办法]
zhao4哥没来...
[解决办法]
可以参考Nginx的内存池, 代码不多, 控制的很精细, 容易读懂源码.
[解决办法]
共同讨论嘛,不要这么争锋相对
[解决办法]
探讨

你给我的感觉就是, 你从来没有看过一个内存池实现, 你也没到一个高度, 那个高度的世界里, 你不是为了代码而效率, 而是为了效率而代码.

[解决办法]


在我的理解里面,
内存池对于使用者来说,就是一种内存分配方式,与基础库的new,delete类似。


对于内存池的实现者来说,就是利用基础库的New,delete再实现一个大块的内存管理类。

也许个人比较懒散,或者说得好听的就是比较实际:
很多编码这玩意的好坏,没有一个绝对的标准,能用最简单方式比较高效的满足项目需求,个人认为就是很效率了。
内存池这玩意也一样,要复杂可以搞得很复杂,要简单也可以搞得很简单,能满足项目需要就可以了。

下面有三个内存池,有兴趣的可以研究下:

google的开源项目:google-perftools
http://code.google.com/p/google-perftools/

A Memory Allocator 
http://g.oswego.edu/dl/html/malloc.html
多平台,代码量不大,应用广泛,但是不是线程安全的。

基于“A Memory Allocator ”编写的线程安全的内存池:nedmalloc
http://www.nedprod.com/programs/portable/nedmalloc/
http://sourceforge.net/projects/nedmalloc/files/latest/download


[解决办法]
Scalable Lock-Free Dynamic Memory Allocation
Maged M. Michael
IBM Thomas J. Watson Research Center
P.O. Box 218, Yorktown Heights, NY 10598, USA
magedm@us.ibm.com

无锁allocator的实现
[解决办法]
http://www.lutiaotiao.com/main/title/66/
供参考
[解决办法]
http://www.lutiaotiao.com/main/title/66/
供参考
[解决办法]

探讨
zhao4哥没来...

[解决办法]
原来malloc要上几百M才叫内存池啊。貌似我们的设备没几百M的内存给你malloc怎么办?假设,我只是说假设啊,如果我做一个视频会议,因为画图的速度也许跟不上视频传输的速度,所以用一段内存保存十帧图片(因为楼上有人说几百M才叫内存池,姑且我就说一段内存吧),难道这样不算内存池了,内存池是按大小定义的?算我孤陋寡闻。
[解决办法]

使用 Intel® Threading Building Blocks

性能卓越。



[解决办法]
确实没啥好讨论的,用途不一样,策略就不一样。Flase sharing是一个应该避免的问题。

论文很多。38楼的测试只是单线程下,确实没有啥优势。

想做到scalable的memory pool,确实需要一定的技巧,

另外 Maged M. Michael 的论文还是别看了,我看过,那个在实验室可以,用在工程中的话,除非你是一个单独做内存池系统的人,而且公司给你1年时间制作,否则你根本做不起。。。。

lock-free不是说玩就玩的。

我不知道你是怎么测试的 boost::pool_allocator,本人使用过,效果不错。至少没你说的那么无用!
你是不是每次都锁一下才调用这个?这个内部是不会锁的,多线程尽量少用锁!!

根据本人的经验,在多线下尽量避免使用全局内存池和频繁分配,多使用栈缓冲。这样内存分配不应该是瓶颈。


记住,多使用栈缓冲,少使用stl,多用数组,链表使用C-Style的,譬如LIST_ENTRY这种插入式的。
线程之间解耦,必要时数据复制,多使用TLS。

记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????
记住了没????


热点排行