虽然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的文章《池内春秋》