关于内存池的线程安全性

164 views
Skip to first unread message

christanxw

unread,
Jul 25, 2008, 2:22:47 AM7/25/08
to 高性能网络编程邮件列表
类似于SGI STL这样的内存池,或其他的内存池,本身都是多线程安全的吗?如果是,那么是如何做到既是线程安全又高效呢?如果是加了锁,那就有线程
需要等待,尽管时间很短,但这样效率会比不用内存池来的快吗?大家在做服务器开发的时候,是如何利用内存池的呢?

gamemake

unread,
Jul 25, 2008, 3:58:17 AM7/25/08
to 高性能网络编程邮件列表
stl 的内存池不是内存安全的。

内存池用 无锁结构 最好。参看 windows 里面的 slist
用slist实现一个固定内存块大小的内存池非常方便。

slist 是一个线程安全的后进先出单链表。

christanxw

unread,
Jul 25, 2008, 4:05:41 AM7/25/08
to 高性能网络编程邮件列表
slist只是个链表而已,如何做到线程安全呢?还有实现内存池应该用更底层的数据结构,而不是用STL之类的东东来实现吧。
> > 需要等待,尽管时间很短,但这样效率会比不用内存池来的快吗?大家在做服务器开发的时候,是如何利用内存池的呢?- 隐藏被引用文字 -
>
> - 显示引用的文字 -
Message has been deleted

Linker Lin

unread,
Jul 26, 2008, 11:28:39 AM7/26/08
to dev4s...@googlegroups.com


2008/7/25 christanxw <chris...@gmail.com>

类似于SGI STL这样的内存池,或其他的内存池,本身都是多线程安全的吗?如果是,那么是如何做到既是线程安全又高效呢?如果是加了锁,那就有线程
需要等待,尽管时间很短,但这样效率会比不用内存池来的快吗?大家在做服务器开发的时候,是如何利用内存池的呢?
 
dlmalloc

 ※※※※※※※※※

Lei Gu

unread,
Jul 27, 2008, 9:29:00 AM7/27/08
to dev4s...@googlegroups.com
内存池只解决了系统层面的问题
服务器逻辑层面需要使用对象池,就类似前面一位仁兄说的,用数组与分配对象空间
 
尽量减少内存的分配和回收才是关键,否则当要面对内存碎片的时候,内存压缩算法总是要多线程同步的

2008/7/26 Linker Lin <linke...@gmail.com>

denny

unread,
Jul 28, 2008, 10:00:41 PM7/28/08
to 高性能网络编程邮件列表
对象池可以在内存池基础上封装,即先计算好对象大小,然后每次分配对象大小的内存,即可实现对象池.


On 7月27日, 下午9时29分, "Lei Gu" <jackf...@gmail.com> wrote:
> 内存池只解决了系统层面的问题
> 服务器逻辑层面需要使用对象池,就类似前面一位仁兄说的,用数组与分配对象空间
>
> 尽量减少内存的分配和回收才是关键,否则当要面对内存碎片的时候,内存压缩算法总是要多线程同步的
>
> 2008/7/26 Linker Lin <linkerli...@gmail.com>
>
>
>
> > 2008/7/25 christanxw <christa...@gmail.com>

十年磨剑

unread,
Jul 29, 2008, 11:20:37 PM7/29/08
to 高性能网络编程邮件列表
感觉楼主对内存池的作用有些误解,我认为内存池的最主要作用是对分配过的内存进行重用,进而避免了外部内存碎片的引入,由于避免了原始malloc可能
的内存合并或拆分,所以速度上可能会有些优势;线程的目的是为了并发处理;所以两者是不冲突的;为了在多线程(进程)下使用内存池,不可避免的需要使用
互斥机制,哪怕是某些类库实现了线程(进程)安全的内存池,在库实现的内部对公共数据也是需要互斥访问的;

On 7月25日, 下午2时22分, christanxw <christa...@gmail.com> wrote:

xmatrix

unread,
Aug 3, 2008, 2:56:17 AM8/3/08
to 高性能网络编程邮件列表
尽量避免内存动态分配。无法避免的就用内存池。内存池要做到多线程安全,锁机制无法避免(有号称无锁的,但其实也是锁,真正的无锁不可能)。

On 7月25日, 下午2时22分, christanxw <christa...@gmail.com> wrote:

gamemake

unread,
Aug 4, 2008, 12:03:34 AM8/4/08
to 高性能网络编程邮件列表
用 freelock 就不会有锁了

jinq...@163.com

unread,
Aug 4, 2008, 1:08:43 AM8/4/08
to dev4s...@googlegroups.com
为什么不是每个线程一个内存池呢?

xmatrix 写道:

esx

unread,
Aug 4, 2008, 1:17:51 AM8/4/08
to 高性能网络编程邮件列表
是的,这样的加锁实现,可能比malloc好不了多少甚至还不如。
> > 需要等待,尽管时间很短,但这样效率会比不用内存池来的快吗?大家在做服务器开发的时候,是如何利用内存池的呢?- Hide quoted text -
>
> - Show quoted text -

esx

unread,
Aug 4, 2008, 1:19:44 AM8/4/08
to 高性能网络编程邮件列表
如果每个线程一个内存池,那谈何多线程编程呢?
况且,如此的话,线程间通信的内存则不能使用该内存池分配,这样反而容易出现需要给多个线程共享的内存被这个线程池分配了,于是bug就出来了。

xmatrix

unread,
Aug 4, 2008, 3:56:07 AM8/4/08
to 高性能网络编程邮件列表
有时可以这么做,如果数据只在一个线程内有效。如果需要在多个线程间传递消息,又想避免数据拷贝(一种费时的操作),那就可能需要多线程内存池,一个线
程中申请,在另外的线程释放。

xmatrix

unread,
Aug 4, 2008, 3:57:53 AM8/4/08
to 高性能网络编程邮件列表
预分配的内存池肯定比系统分配的快,如果慢的话,应该是实现的问题。特别是对大小相同的内存块的分配,分配的时间复杂度一般是O(1)。
> > - Show quoted text -- 隐藏被引用文字 -
>
> - 显示引用的文字 -

xmatrix

unread,
Aug 4, 2008, 3:58:27 AM8/4/08
to 高性能网络编程邮件列表
是的。
Reply all
Reply to author
Forward
0 new messages