内存那些事(一)

来源:互联网 发布:全球省市区数据库 编辑:程序博客网 时间:2024/04/30 16:16

开学的时候,就跟同学说,会跟他们讲讲内存的管理,可惜,一直忙着项目的转接手续和实习招聘,并没有得到机会认认真真的准备一个资料给他们,今天,就一个一个写过去吧。
[ps:这个是给自己看的]

先规划一个总体的内容:
(一)概述
linux的内存管理
语言的内存管理(c/c++、java、python、go)
容器的内存管理(netty、nginx)

linux的内存管理,

操作系统课上讲的,不多赘述,主要关注slab分配器和伙伴系统,可以复习一下《深入理解linux内核》和《深入理解计算机系统》、《现代操作系统》相关内容,也可以参考这个博文

重点关注大内存的管理和小内存的处理,以及内存回收的处理。伙伴系统是常用的

语言的内存模型 :

c++可以参考这个 : [http://www.cnblogs.com/lancidie/archive/2011/08/05/2128318.html]、顺便参考一下《STL源码解析》
java的呢,看书去吧 :《深入理解java虚拟机》、《java 7 virtual machine specification》
python : 滚去看书和源代码(推荐这个)去吧 《python源代码分析》(这个是老版本的python2.x)
go : 这个看代码嫌太烦的话,可以参考这个

c++虽然将内存讲给了工程师管理了,但是new的设计对malloc除了一些处理,分成了大内存分配和小内存分配,小内存分配构成了三级结构(freelist->pool->malloc),使用freelist解决小内存的频繁放入和回收,以256为界,小内存以2的指数幂构成内存分配格局, 更多的内存设计可以参考《STL源码解析》,java的对管理技术不必赘述,java人随口可以说出工作内存和运行时的各种细节,略去;在python中,python为经常使用的int小数提前分配了小数,只要通过引用技术就行了,同时,对各种数据类型的支持还增加了内存池,避免频繁的内存分配和释放;go,资料不足,自己使用不多,可以参考上海4月份的gopher大会,有相关的演讲, 抱歉地址找不到了。

容器的内存管理:

netty看源代码去,重点关注 各种bytebuf相关设计、poolarena、poolchunk、poolchunklist

nginx内存设计:和netty相比,在于chunk的组织方式,nginx纯粹的数组+链表的组织方式,使用freelist链表表示空闲空间,使用bit位表示包含subpage的page中subpage的分配情况,在netty中,使用满二叉树管理page的可用情况(满二叉树还是使用数组+链表),内部也是使用bit位的设计,两者的设计思想基本相同(好像话说的有点满)

容器的设计也是中规中矩,nginx是c代码,自己实现内存管理是情有可原的,netty,为了实现更加高效的管理,也是java里面我至今看到的唯一自己写内存管理的,java容器自己写内存的,之前确实没有见过。
容器的内存设计,相比于语言的设计,大体上是相似的,出入不大。大三上学学习操作系统的时候,也被要求过写过相应的内存管理模块,并没有考虑这么细致,记着以后用

写给自己看 2015/5/31
0 0
原创粉丝点击