你说的是内存管理吧。可以参考一下:
Lea Allocator,据说 Linux 内部的 malloc 就是用这个,很稳定、高效。- -!
偶没认真看过。
http://g.oswego.edu/dl/html/malloc.html
其实一般 freelist 的实现已经很好用了,C++ 实现参考 jjhou 的《STL源码剖
析》。pure C 实现看看 cloudwu 的 WindSoul 里面就有。
如果想看很漂亮的 C++ 实现,可以欣赏一下 Hoard,网站上还有不错的论文介绍。
http://www.hoard.org/
:-), hope it's help!!!
关中刀客 写道:
On 7月1日, 下午12时59分, qiaojie <qiao...@gmail.com> wrote:
> 系统本来提供了一个标准的轮子给大家使用,经过大家无数次的使用证明是个坚固耐用的好轮子,某日,楼主听说某种改装的新轮子在过弯道时可以跑的更快,于是他认定 这标准轮子不是个好轮子,有必要重新发明种新轮子,既可以跑直道又可以跑弯道,可是我们的楼主自信心很强,连轮子长什么样都没搞清出就大笔一挥发明出了个三角形 轮子。
>
> 在07-7-1,关中刀客 <guanzhongda...@gmail.com> 写道:
>
>
>
>
>
> > 一般大家在server中对于固定大小的对象,都会使用"对象池"方案,但是对于非固定的大小的频繁需要的变量是否都会实现一个真正的"内存池"来隔离
> > new/delete呢?我最近做了一个这个"内存池",刚开始分配很多空间,比如1M,然后"内存管理器"中存在两张表:一个以分配的块表map<开
> > 始位置,大小>,一个未分配表
> > map<开始位置,大小>,每次分配的时候从未分配空间中找到合适的块,从它的表中删除这个信息,然后把信息存进"以分配表"。就这样子做,结果在单线
> > 程中测试,和new相比,速度慢了n倍,(可能我模拟的环境不对吧)。
> > 大家一般怎么做?- 隐藏被引用文字 -
>
> - 显示引用的文字 -
我曾用list<...> 等做基础给别人演示原理随手写了个简单的内存池,速度只有malloc的1/3 - 1/5左右,后来真正写内存池的时候又
把这个代码拿来profile 了一下,发现大多数时间消耗在list插入对象等上面,所以我认为做内存池这种底层的追求效率的东西用stl是不合适
的,需要用些最基础的高效的数据结构方面的知识。
关中刀客 <guanzho...@gmail.com> 发件人: dev4s...@googlegroups.com 2007-07-04 11:22 |
|
|
譬如上面几位都有提到的STL和DLMalloc,当然你也可以简单的使用Lookaside技术。
前者一般是标准的内存池管理实现,而后者则是标准的通用内存管理器实现。
再者从实际上运用来说,他们都各有所长,STL那个很擅长小对象分配,因为他只管理128k以下的小内存,再大的扔给系统。
而DLMalloc,也就是linux上使用的那个,比较适合替换程序中的global new。因为它通吃任何大小的内存。
至于Lookaside,则是太简单不过,我见过很多人的内存管理都是用这种方案,做一个模版类,然后初始分配1000块,
使用一个栈或列表机制,完成其new和delete的处理。当然,你也可以认为STL是一个Lookaside机制的管理器:)
其实除此之外,另外还有一个大家可能不太熟悉的开源研究项目,那就是PTMalloc,
我看过作者的文章,他的意思是这是一个parallelism+scalable的内存分配系统,在多线程上表现俱佳。
关于其他补充的细节,在MSDN上,你可以找到一篇文章:《堆:欢乐和痛苦》(有中文版了),
里面也讲道了关于内存的一些特性。其实当时我在看这篇文章的时候,比较感兴趣他说的一句话:
"由于几个同事的努力和辛勤工作,1998 年初 Microsoft Windows(R) 2000 中有了几个重大改进:"
关于这句话我当时特意做了例子测试了一下(XP系统),但是发现还是很慢。
可是后来我在一个需要大量分配小内存的产品中(完整运行一次大概需要3小时,大概有800万个小对象分配),
加了一个宏来开启或者管理内存池,使用STL的那种方案,结果发现开启和不开启仅仅差几十秒钟,那可是3小时周期的啊......
至于这个原因,根据我的测试经验,发现在多线程下分配大内存,系统会很慢,但是如果是小内存,似乎也可以承受。
在单线程情况下,系统的分配速度已经很快了。所以楼主在单线程下测试毫无意义。
单线程+内存池,听起来就有一些不平坦。
好了,说了这么多,我觉得,是否使用内存管理,要看个人的判断能力,代码能力,个人经验以及
程序中内存的使用次数多少,或者程序的profile等等决定。
单独的问是否使用内存池,就象问自己,明天是否还会在这家公司上班一样,问题简单,而其答案变幻莫测。
笔误,128 bytes,呵呵~
在yahoo group上有它的讨论组,有兴趣可以去看看。
On 7月1日, 下午12时28分, 关中刀客 <guanzhongda...@gmail.com> wrote:
常规步骤就是预先分配一大块内存,然后切分成一个个的块(我爱叫 chunk 或者
node),供分配.
一般来说,每次内存池枯竭的时候内存池再向系统申请一块比预先分配的大块内存更大
(一般是 *2) 的一块内存,所谓的用户需求猜测原则,每次申请的大内存块按一个
基数倍增,
一般大块内存块用一个单链将块串在一起就可以了,被切分出来的 chunk 指针用
一个 std::list 串起
来就可以了。
我用这种方法实现的 memory/object pool 比 new/delete 快 30 ~ 50 倍左右。
而且基本没有什么内存碎片。
我觉得关键就是要每次都要向系统申请一个大内存块,偶看过很多简单实现都是做
一个 for, 然后循环
new 出很多 chunk 放到一个容器(比如 vector/map) 里,内存碎片太多。
你的处理了多线程同步吗,是不同步状态测试的速度比吧。我测试的结果是如果不处理同步(其实这种情况意义不是很大)速度比是65:1,处理同步速度比
是 n : 1 其中 n 介于 (1.x , 3.x) 之间
我对数据包不是分配固定大小的,而是圆整到一个尺寸,每次发送的时候浪费一点点,发送的时候吧要发送的东西挂在一起,等可发送的时候WSASend一把
吧多个包绑定发送出去,接收的时候用一个4k或8k的块接收。
有关allocator的最重要的事实是它们只是为了一个目的:封装STL容器在内存管理上的低层细节。
________________________________________________________________________
2.不知道大家试过boost::pool没有
http://www.boost.org/libs/pool/doc/index.html
摘录一点如下
What is Pool?
Pool allocation is a memory allocation scheme that is very fast, but
limited in its usage. For more information on pool allocation (also
called "simple segregated storage"), see the concepts document.
在 07-8-23,arcnode<arc...@gmail.com> 写道:
--
我的博客:http://zsp.javaeye.com/
-- 张沈鹏(ZhangShen Peng)
On 8月24日, 上午9时28分, "!张沈鹏(电子科大 08年毕业)" <zsp...@gmail.com> wrote:
> 很久没有写c++,下面的话如果有错误,请指教:)
> 1.我记得stl中是有内存池的(不应该用list,map这些高级组件再去实现)
> 大家可以参考这篇文章
> 标准库 STL :Allocator能做什么?
> 摘录一点如下
> ________________________________________________________________________
> 每个 C++程序员都已经知道动态内存分配:写下new X来分配内存和创建一个X类型的新对象,写下delete
> p来销毁p所指的对象并归还其内存。你有理由认为allocator会使用new和delete--但它们没有。(C++标准将::operator
> new()描述为"allocation function",但很奇怪,allocator并不是这样的。)
>
> 有关allocator的最重要的事实是它们只是为了一个目的:封装STL容器在内存管理上的低层细节。
>
> ________________________________________________________________________
> 2.不知道大家试过boost::pool没有http://www.boost.org/libs/pool/doc/index.html
> 摘录一点如下
> What is Pool?
>
> Pool allocation is a memory allocation scheme that is very fast, but
> limited in its usage. For more information on pool allocation (also
> called "simple segregated storage"), see the concepts document.
>
> 在 07-8-23,arcnode<arcn...@gmail.com> 写道:
实际开发中往往需要的是一个简单的高效的牵扯少的模块,如果其他部分没有用boost我想大多数开发人员不会单为了一个mempool而去导入一个
boost库。
On 8月24日, 上午9时28分, "!张沈鹏(电子科大 08年毕业)" <zsp...@gmail.com> wrote:
> 很久没有写c++,下面的话如果有错误,请指教:)
> 1.我记得stl中是有内存池的(不应该用list,map这些高级组件再去实现)
> 大家可以参考这篇文章
> 标准库 STL :Allocator能做什么?
> 摘录一点如下
> ________________________________________________________________________
> 每个 C++程序员都已经知道动态内存分配:写下new X来分配内存和创建一个X类型的新对象,写下delete
> p来销毁p所指的对象并归还其内存。你有理由认为allocator会使用new和delete--但它们没有。(C++标准将::operator
> new()描述为"allocation function",但很奇怪,allocator并不是这样的。)
>
> 有关allocator的最重要的事实是它们只是为了一个目的:封装STL容器在内存管理上的低层细节。
>
> ________________________________________________________________________
> 2.不知道大家试过boost::pool没有http://www.boost.org/libs/pool/doc/index.html
> 摘录一点如下
> What is Pool?
>
> Pool allocation is a memory allocation scheme that is very fast, but
> limited in its usage. For more information on pool allocation (also
> called "simple segregated storage"), see the concepts document.
>
> 在 07-8-23,arcnode<arcn...@gmail.com> 写道:
2.我boost的虽然有一点牵扯,但是可以试一试?boost还是很好用的:)
3.我的意思不是用stl的组件去实现内存池,而是直接调用它的allocator.不过看来有的stl库的allocator没有实现内存池,有的实现了,不统一:).
所以,我现在认为实现一个allocator,作为参数传给stl容器:)附件文章中有介绍
最后,我承认,我没有写过mempool或objpool的,纸上谈兵:)
在 07-8-24,sunway<sunh...@gmail.com> 写道:
On 8月24日, 下午1时48分, "!张沈鹏(电子科大 08年毕业)" <zsp...@gmail.com> wrote:
> 1.首先,附件里面有一份不错的关于内存池的文章(不过是很久以前的文章了)
>
> 2.我boost的虽然有一点牵扯,但是可以试一试?boost还是很好用的:)
>
> 3.我的意思不是用stl的组件去实现内存池,而是直接调用它的allocator.不过看来有的stl库的allocator没有实现内存池,有的实现了,不 统一:).
>
> 所以,我现在认为实现一个allocator,作为参数传给stl容器:)附件文章中有介绍
>
> 最后,我承认,我没有写过mempool或objpool的,纸上谈兵:)
>
> 在 07-8-24,sunway<sunhui...@gmail.com> 写道:
> 池内春秋.pdf
> 625K下载
>
> [Memory Pool 的设计哲学与无痛运用.htm]
> ± ... § Memory Pool ,,è è " - - è "¨
>
>
>
> - programmer-13-memory-pool.pdf
>
> ,, è€...: "Peng Chunhua" <chp...@psh.com.cn>
> é€ - : 2002 9 12 - AM 11:00
> -¨: ... - [ ± ... § ] - ,, € é- é
>
>
>
> To: ... "
> ,¨ € ... " ,, - ,, ... è è° ' é- é è è ... é € è · é ... €,è° è° €,
> ... " ¨ €è ' € ,, € ¨ ' € , - 2002 9 ‰ 'è ¨ € - [ ± ... § ] Memory Pool ,, € €, è é " €é ¨ € ¨ ' € € è 'è ¨ €, ‰€ ‰ è ¤ ... Memory Pool ,, è ¨ ... €, è ¨ ... - [ é- ,,é ¤- €é"€] ' [é€ ,,é ¤- €é"€] ,,è · ‰ , -'é- ... " · €,
> € é- ,,é ¤- €é"€
> ... " è ¤ ¨C++ ° ,, ... é... · ...· é ¤- ,,é... Cookie €, è è è €,
> ... 'è ¤ è è ‰è ,, é - ... VC6 ' C++Builder ¨ ... °± € · ,, €,é€ è ' ' °new ¨ · ±,è, è° "¨malloc ,, ¨C++ ° ‰ €, ‰€ è € malloc ,, ° °± €, ¨VC6.0 , "¨Debug ‰ ,,è °± ' ... " è ,, € · ‰é ¤- €é"€ 32 -è , "¨ è ° · ... é" è ¨ ' é... ... ,, - è · -è , ·° é... ,, € €,è °± VC6 ¨Debug ‰ € ... ,, ,, €, ...· " è€ € malloc ,,Debug ‰ ° ,, °± ,, €, ¨VC6.0 ,,Release ‰ °± ‰è é ¤-è ° · malloc ,, ° è° "¨HeapAlloc ,, é " è° "¨HeapFree ,, VC è ‰ ... è è · ¤ é € ,, " €, ‰€ ¨Release ‰ malloc ,,è " € ‰ - HeapAlloc ,, € è€ Debug malloc ,, € °± ‰ - HeapAlloc() + 0x20 ,, € €,è - ... ,, ¤§ ° ¨Release ‰ é€ è HeapSize - ° ,, €, " ¨VC € ¨ - ‰€ ‰ ,,malloc, newé ¨ € Heap " ,, ¨VC ,,è è _crtheap €,è °± €é ¨ " è ·10000000 C1 ,, è± - VC "C++ Builder è ±è ,, - é- "è é· ,, € €, è ¨Release ‰ " è · ... ,, ¤ é ¨ ‰32 -è ,è ° · ... ,, € " , ¤§ ° €, è Cookie ' C++ ° - ... °± è ‰€ ‰ "¨HeapAlloc é... ,, ... ¨ ¤ é ¨é ‰32 -è , ,,é ¤- €é"€ €, 32 -è , " ¨ " è · ... ,, ° ‰ € è ° ‰
> ¨C++Builder ... ' VC € · ,, €,C++Buider "¨Heapè è ... ,, é... è€ è è é€ è TMemoryManagerè è ... €, ...· " - é€ è VirtualAlloc € é... 16KByte -è , " ¨ é€ è malloc é... ... - C++Builder °±é è è ,, ... ° é- ,, ... è è é... ¨ ¤ é ¨è ° · ... ,, ¤§ ° €, " ... è - € è° "¨VirtualAlloc ' " è · ... "±C++Builderè è é... €, ‰€ ... " ¨ é- è è C++Builderè ¨ ° €,
> é€ è
> ‰ é "è VC6.0 ' C++Builder ,, ... ,, é, é - ¨é€ VC ' C++Builder ,, · , °± é è§ €,VC ,, ... é... ¨ € ¨ - é ¨_crtheap é... ,, " " è · ... - VC ...é "± Heapé · Heap è è " è · €,è€ C++Builder é €é - ... é è è ,,VirtualAllocé" è ¨ ' °VirtualAlloc ‰ é- ... - é è VirtualAlloc ,, ... €,è · "± - € VirtualAlloc " ¤ malloc ,, ... ¨é · ... ,, - é- °± "VC €, " , € VirtualAlloc ,, ... m malloc é, é · é... n*m ... è€ è¨€ é... € ... ,,è ±è
> VC = n*m
> C++Builder=n+m
> · ¨ - , C++Builder ¨ ... € VirtualAlloc ,, ¤§ ° 16K(0x4000)è€ ¤§ ¨è § é... 1000000 ... - é€ "è € , €,( è , · °è ) é C++Builder ,, ... °± è§ €é ¨C++Builder ,, ¨ ° è € - ... " è · ' é " é€ è TaskManagerè§, ... "¨é € ° ‰§è è " ‰ €, VirtualAlloc ,, € - ... è "¨ ,,è ... - ... é è é " C++Builder è ° è ... ¤ é " €,
> - GCC ,, -è ' ¨ ' ‰ " è ¨ ¤ · 'è ¨ · €,
>
>
>
> E-mail:chp...@psh.com.cn
>
>
>
> - · è
>
>
>
> ,, è° ,¨ ,, ,, è§ ' è ...... €, ‰ · € è · ... è ' - ° ,¨ ,, " ¨ · ' " ± ... § " € - ,,è ...... €,
> ' ° è ¤ " € è€ ‰€ ,, € ·± ¤,, €, ...
>
> 阅读更多 - 隐藏被引用文字 -
>
> - 显示引用的文字 -
On 8月24日, 上午9时28分, "!张沈鹏(电子科大 08年毕业)" <zsp...@gmail.com> wrote:
> 很久没有写c++,下面的话如果有错误,请指教:)
> 1.我记得stl中是有内存池的(不应该用list,map这些高级组件再去实现)
> 大家可以参考这篇文章
> 标准库 STL :Allocator能做什么?
> 摘录一点如下
> ________________________________________________________________________
> 每个 C++程序员都已经知道动态内存分配:写下new X来分配内存和创建一个X类型的新对象,写下delete
> p来销毁p所指的对象并归还其内存。你有理由认为allocator会使用new和delete--但它们没有。(C++标准将::operator
> new()描述为"allocation function",但很奇怪,allocator并不是这样的。)
>
> 有关allocator的最重要的事实是它们只是为了一个目的:封装STL容器在内存管理上的低层细节。
>
> ________________________________________________________________________
> 2.不知道大家试过boost::pool没有http://www.boost.org/libs/pool/doc/index.html
> 摘录一点如下
> What is Pool?
>
> Pool allocation is a memory allocation scheme that is very fast, but
> limited in its usage. For more information on pool allocation (also
> called "simple segregated storage"), see the concepts document.
>
> 在 07-8-23,arcnode<arcn...@gmail.com> 写道: