虽然Memory Pool/Cache似乎是比较偏系统底层的东西,但是很多大规模分配和释放memory的程序在到了优化阶段之后,使用Memory Pool/Cache几乎是一个必备的手段。这跟互联网应用的大量连接的应用类似,这类应用往往也要使用Thread Pool,来避免不停创建/销毁线程的高昂代价。

至于Memory Pool和Memory Cache的相同与不同之处,我个人是这么理解的:

1 相同之处:(为了达到提高效率的目的)允许有效数据和无效数据并存。而且,无论是Pool还是cache,往往都是限定大小的区域(因为在运行时改变大小,就意味着巨大的开销)。

2 不同之处:对Pool来说,有效数据是不可销毁的,重复利用的只是那些无效数据所占据的空间。但是对cache来说,它的全部内容都是可替换的。究其原因还是因为二者目的不同:cache是为了缓和两种存储设备速度上的差距而出现的存储结构(这意味着,如果一种设备速度快,则贪婪的利用此种设备);而Pool是为了缓和分配和释放存储之间的速度差距而出现的存储结构。

而这里另外还有一个易混淆的概念:buffer。buffer,翻译作缓冲区。字面上的意思似乎跟cache(高速缓存)差不多。但是还是有区别的。缓冲区也是工作在两个设备之间,但是不同于cache工作在两种速度差异极大的设备之间,它适用的范围是若干个速度差不多的设备,而这些设备的存储方式是正好相反的:读和写。例如,最常见的buffer莫过于TCP/IP协议栈的buffer,它的出现就是因为网络写入和协议栈读取速度不完全匹配,但是二者的速度是差不多的,如果网络和协议栈的速度不匹配,那么buffer再大也是没有用的。

【若干解决方案】

1 最出名的莫过于Linux内核的Slab/buddy系统。链接就不用给了。

2 各种大型的开源软件中,例如nginx/apache的APR/Berkeley DB/memcached/boost/stlport

3 刚看到的PJLIB。http://www.pjsip.org./pjlib/docs/html/main.htm

4 网上某些牛人的实现方案(待添加):

http://febird.javaeye.com/blog/501549

【留着以后看】

http://www.memorymanagement.org/articles/begin.html

JJHou的文章《池内春秋》

http://jjhou.boolan.com/programmer-13-memory-pool.pdf


posted on 2011-05-12 01:30  微型葡萄  阅读(621)  评论(0编辑  收藏  举报