2004年第1期福建电脑13Linux内存管理的主要数据结构分析陈(华南热带农业大学,绮海南海口571737)【摘要】Linux的研究方兴未艾,对Linu)(源代码的全面剖析是很繁琐但同时又是很有意义的一项工程.
本文以n··内核2.
4.
18为蓝本,着重对Linux内存管理中的几个主要数据结构进行分析,让nn爱好者从一个侧面了解LizIUX的内存管理实现.
【关键词】Linux内存数据结构一直以来,由于人们所需要的内存数目远远大于物理内存,人们设计出了各种各样的策略来解决此问题,其中最成功的是虚拟内存技术.
每个进程的虚拟内存用一个mmstruct数据结构表示.
这包括当前执行的映像的信息和指向一组vm—area—struct结构的指针.
每一个vm—area—struct的数据结构都描述了内存区域的起始、进程对于内存区域的访问权限和对于这段内存的操作,通过这两个主要结构,能够把虚存段很好的组织和管理起来.
但是,在操作系统运作过程中,经常会涉及到大量对象的重复生成、使用和释放问题,为提高对象的使用效率,改善整个系统的性能,内存管理采用了slab算法(关于内存管理中的主要算法将另具文章讨论),从而大大提高了内存的利用率以及硬件缓存区级系统总线的利用率,为此引入了一些数据结构,;乓中较主要的有kmem_cache_s结构.
尽管Linux采用虚拟存储管理策略,有些操作仍然需要直接针对物理内存.
例如,为刚创建的进程分配页目录,为装入进程的代码段分配空间,为I/0操作准备缓冲区等等.
物理内存以页帧为单位,页帧的长度固定,等于页长,对IntelCPU缺省为4KB.
对每个物理页帧,内核定义page类型的memmap.
j数据结构进行描述.
下面我们来看看所提到的这几个主要数据结构:1、虚拟内存的mm__struct结构:(include/linux/sched.
h)每当新建一个进程,Linux都为其分配一个task_struct结构,此结构中内嵌mm_struct,有关用户进程中与存储有关的信息都包含在mmstruct中.
stmctVlUjtreastructmmap;/指向VMA段双向链表的指针/rb_root_tmm_rb;/指向VMA段红黑树的指针/structVltl~treastructmmap_cachc;/存储上次对Yllla块的查找操作的结果/pgdJpgd;/进程页目录的起始地址/atomicJI11in_uscrs;/记录目前正在使用此mm~struct结构的用户个数/alomicJnlm_count;/inm~struct被内核线程引用次数/intmap_count;/进程所使用的VMA块的个数/stmctrw~semaphoreIiIinap_tseln;/对Inmap操作的互斥信号量,由down()和up()更改/spinlockJpageJableJock;/对此进程的页表操作时所需要的自旋锁/stmct】ist_headmmlist;/task~truct中的active_mm域的链表/unsignedlongstaff_code,end_code,start_data,enddata;/进程代码段的起始地址和结束地址、进程数据段的起始地址和结灵地址/uttsigncdtongstan_brk,brk,start_stack;/进程来初始化的数据段的起始地址和结束地址/unsignedlongarg.
_,start,arg_end,env_~tart,env_end;/调用参数的起始地址和结束地址/unsignedlongrss,tota1.
_vm,locked_vm;/rss进程内容驻留在物理内存的页面总数/unsignedlongdefags;unsignedlongcpu_vmjnask;unsignedlongsap_.
address/页面换出过程中用到的交换空间地址/unsigneddumpable:l;inln_context.
Jcontext;/存放当前进程使用的段起始地址/此nnn_struct结构包含一个进程虚存空间的基本面描述和相关的信息记录,它是后续虚存段管理的基础.
2、虚存段的数据结构:(include/linux/mm,t1)进程可用虚存空问共有4GB,但这4GB空间并不是可以让用户态进程任意使用的,只是0至3GB之间的那一部分可以被直接使用,剩下的1GB空间则是属于内核的,用户态进程不能直接访问到.
所有进程的3GB至4GB的虚存空间的映像都是相同的,以此方式共享核心的代码段和数据段.
一个进程在运行过程中使用到的物理内存一般是不连续的,用到的虚拟地址也不是连成一片的,而是被分成几块,进程通常占用几个虚存段,分别用于代码段、数据段、堆栈段等.
每个进程的所有虚存段通过指针构成链表,虚存段在此链表中的排列顺序按照它们的地址增长顺序进行.
nnu)(定义了虚存段vma,即virtualmemoryarea.
vma段是属于某个进程的一段连续的虚存空间,在这段虚存里的所有页面拥有一些相同的特征,例如,属于同一进程,相同的访问权限,同时被锁定(1ocked),同时受保护(protected)等.
vma段由数据结构vm_area_struct描述如下:structvln_area_~tmct{structmm_atructvm_mm;/同一个进程的所有VMA块用这个指针指向此进程的mm~truct结构/unsignedlongvm~tart;/VMA描述的虚拟内存段起始地址/unsignedlongvm_end;/VMA描述的虚拟内存段结束地址/stnlctvmJrea.
gt~ctvmnext;/进程所使用的按地址排序的vm_.
area链表指针/pgpmUvmemt;/此变量指示本ⅧA块中所有页面的保护模式/unsignedlongvmSlags;/本VMA块的属性标志位.
/rb_nodeJvm.
/b;/用于对VMA块进行rb(RedBlackTree)操作的结构体,其定义位置在include/linux/rbtree.
h,line109/structvmJu'ea.
.
~tnlctvm_next_~hare;/指向共享块链表中的前一个VMA块的指针/structvm.
.
area_~tmctvm.
j)prcv~share;/指向共享块链表中的后一个VMA块的指针/structvm_operationsjtmetwn_ops;/指向一个结构体的指针,该结构体中是对VMA段进行操作的函数指针的集合.
参见include/linux/mm.
h中的line130structvmoperations~struct/unsignedlongvm.
2~goff;/Offset(withinvm_Iile)inPAGE_SIZEunits,not*PAGE.
.
CACHESIZE/structfilevmdile;/如果此VMA段是对某个文件的映射,vmjilc为指向这个文件结构的指针/unsignedlongvmj'aend;/XXX:putfullreadaheadinfohere/voidvm~rivatedata;/wasvm~te(sharedmem)/};当一个执行映像映射到进程的虚拟地址空间时,产生一组vm_area_struct数据结构.
每一个vm_area_struct结构表示执行映像的一部分:执行代码、初始化数据(变量)、未初始化数据等等.
Linux支持一系列标准的虚拟内存操作,当vm_area_struct数据结构创建时,一组正确的虚拟内存操作就和它们关联在一起.
(参见下图)进程的虚存管理数据结构3、对象缓存中的kmem_cache_s:(1inux/mm/slab.
c)维普资讯http://www.
cqvip.
coml4福建电脑2004年第1期Linux系统中所用到的对象,一般说来种类相对稳定如inode、task_struct等),然而每类对象的数量却是大量的,并且在初始化与析构时要做大量的工作,所占时间比例大大超过内存分配所占用的时间,但是这些对象往往具有这样的一个性质,即它们在生成时,所包括的成员属性值一般都赋成确定的数值,并且在使用完毕,释放结构前,这些成员属性又恢复为未使用前的状态.
为此,内存管理中引入了slab算法,以解决对象重复生成、使用和释放问题.
Slab算法思路中最基本的一点被称为objec,t—aching,即对象缓存,其中一个重要数据结构如下:streetkuletIIcaches(/1)eachalloc&free//full,partialfirst,thel~free-k"/siructlistJmadslabsju11;/slab中的完全块/structlistheadslabsA)artial:/slab中的部分块/structlistheat{sial~free;/slab中的空闲块/unsignedintobjsize;/此slab块中对象的大小/unsignedinlflags;/属性标志/illlsignedintIlUltl;/此缓存区中的每个slah中的对象个数/suinlock_tspinlock;/互斥锁.
所有的cache都位于一条链表上,在访问cache时使用这个互斥信号量来避免同时访问这条链表.
/#ifdefCONFIG.
sMPunsignedild1)atchcount;#endif/2)slabadditionsgremovals-k/Ul·signcdintgfporder;/该缓存区中每个slab块中包含页面个数相对于2的幂次方/unsignedintgfpflags;/申请页面时用到的申请优先数/sizc_tcolour;/染色计数器可以达到的最大值/u【1signedintcohmroff;/缓存区中slab块之问的相对距离,r/unsignedintcolourncxt;/染色计数器/k【lICre.
sacllc_tslabp_caclle;/对于offslHb方式此指针指向一块公共旧t:ache~labp缓存区,此缓存区用以存放与每个slab块相对应的slabj结构.
/unsignedintgrowing;/正在对此缓存区增加新的slab块的时候波此标志,用于防止同时对此slab块的收缩操作.
/unsignedintdflags;/动态属性标志/void(ctor)(void,klnemcachet,unsignedlong);/对象的构造函数,在创建新的slab块之后给这个块中的每个对象删用此构造函数/void(dtor)(vIJid,klncmcachet.
unsignedlong);/对象的析构函数/unsignedlongfailures;/-k.
3)cachecreation/renloval/chari'lallle【CACHEAMELEN];/此缓存区的名字.
它将出在/proc/slabinfo文件中.
/~tructlist_headnext;/指向F一个缓存区结构的指针/#ifdefCONFIG.
sMP/4)per—cpudata//以下是对多处理器的支持部分,注释略/cpucachejcpudata【NRCPUS];#endif#ifSTA"ISunsignedlongunsignedlongunsignedlongunsignedlongunsignedlongunsiomdtollg抖·fdefC0NFIG_SMPatontICtatotlticjalIochit:Ioclniss;frohlt:#endif#endifl;在slab算法中,一种对象的所有实例都存在同一个缓存区中.
不同的对象,即使大小相同,也放在不同的缓存区中.
每一缓存区有若干个slab块,按照满、半满、空的顺序排列.
Slab块是内核内存分配与页面级分配的接口.
每个slab块的大小都为页面大小的整数倍,由若干对象组成.
引入slab块的目的之一就是通过染色机制使slab块在硬件缓存区中均匀分布,从而也使对象的分布达到均匀状态,以达到提高硬件缓存区级系统总路线的利用率.
在这里,所谓的染色机制是指,按照对象要求的对齐字节数,分配合适的着色区,(即偏移量),以使该类对象有良好的地址分布,便于硬件操作.
4、物理空间管理中的mem_map_t:(inelude/linux/mm.
h)Linux对整个物理内存的管理通过mem_map表描述.
它本身是关于structpagemernjnapj(如下结构)的数组,每项对应一个关于内核态、用户态代码和数据等的页帧.
typedefstructpage(structlistJIcadlist;/这个list用来将这页挂在不同用途的链表中/structaddress_spacemapping;/当此页帧的内容是文件时,由这个mapping所指的address_space型变量记录了inodecache(也就是page缓存区)链表的表头指针.
/unsignedlongindex;/当此页被换出到交换空间中时,这个in-dex对其在交换空间中的位置进行索引/structpagenext_hash;/用于page缓存区中链表元素的连接/atomicjcount;/指明目前使用该页面的用户数/mmignedlongflags;/此变量中的不同的位描述此页属性/structlistJIcadlru;/Pageoutlist,eg.
active_list;protectedbypagemaP-lru3oek!
!
/structpagepprev.
.
haab;/nexthash.
的辅助指针/structbuffer_hcadbuffers;/映射磁盘块的缓冲区//OnmachineswhereallRAMismappedintokerneladdressspacewecansimplycalculatethevirtualaddress.
Onmachineswithhighmemsomememoryismappedintokernelvirtualmemorydynamically.
soweneedaplacetostorethataddress.
Notethatthisfieldcouldbe16bitsonx86.
.
.
:)ArchitectureswithslowmultiplicationcandefineAGEVIRTUALinasm/page.
h/#ifdefined(CONHG3-IIGHMEM)voidvirtual;ie.
highmem)/#endif/CONFIGJ{IGMEMIIdefined(WANTAGEy【IlTI『AL)/Kernelvirtualaddress(NULLifnotkmapped,WANTAGE—v1RTUAL/JmemAnapA;在一个虚拟内存系统中,所有的地址都是虚拟地址而非物理地址.
处理器通过操作系统保存的一组信息将虚拟地址转换为物理地址,这可以通过页表来实现.
这部分的知识在操作系统课程里有专门的介绍.
Linux内存管理中所用到的数据结构当然不止这几个,但这些是比较重要,有的也比较不易理解,其它还有一些数据结构,相对比较简单,并与上面所提的这些数据结构联系紧密,感兴趣的读者可以参看其源代码.
参考文献【1J《Linux内核2.
4版源代码分析大全》,李善平等著,2002年1月机械工业出版社【2】《现代操作系统教程》,滕至阳著,2000年5月高等教育出版社…Ⅲm维普资讯http://www.
cqvip.
com
便宜的香港vps多少钱?现在国外VPS主机的价格已经很便宜了,美国VPS主机最低一个月只要十几元,但同样免备案的香港VPS价格贵不贵呢?或者说便宜的香港VPS多少钱?香港vps主机价格要比美国机房的贵一些,但比国内的又便宜不少,所以目前情况是同等配置下,美国VPS比香港的便宜,香港VPS比国内(指大陆地区)的便宜。目前,最便宜香港vps低至3元/首月、18元/月起,今天云服务器网(www.yunt...
特网云为您提供高速、稳定、安全、弹性的云计算服务计算、存储、监控、安全,完善的云产品满足您的一切所需,深耕云计算领域10余年;我们拥有前沿的核心技术,始终致力于为政府机构、企业组织和个人开发者提供稳定、安全、可靠、高性价比的云计算产品与服务。公司名:珠海市特网科技有限公司官方网站:https://www.56dr.com特网云为您提供高速、稳定、安全、弹性的云计算服务 计算、存储、监控、安全,完善...
触摸云国内IDC/ISP资质齐全商家,与香港公司联合运营, 已超8年运营 。本次为大家带来的是双12特惠活动,美国高防|美国大宽带买就可申请配置升档一级[CPU内存宽带流量选一]升档方式:CPU内存宽带流量任选其一,工单申请免费升级一档珠海触摸云科技有限公司官方网站:https://cmzi.com/可新购免费升档配置套餐:地区CPU内存带宽数据盘价格购买地址美国高防 1核 1G10M20G 26...
linux内存管理为你推荐
独立ip空间如何给网站申请独立的IP空间info域名注册INFO域名有没有注册价值?香港虚拟空间香港空间,香港虚拟主机,香港虚拟空间推荐一家,公司要做一个网站,需要1G的,不限流量的,其它的空间不要asp网站空间谁有能申请免费的ASP空间网站?100m虚拟主机100M的虚拟主机都能做些什么虚拟主机软件常见的虚拟机软件有哪几种?大连虚拟主机找个大连企业建站公司,大家给推荐一下吧。美国免费虚拟主机美国虚拟主机怎么样?美国虚拟主机那个比较好?华众虚拟主机管理系统华众虚拟主机管理系统请问。华众 虚拟主机管理系统 这个问题 怎么解决 。就是后台可以开通虚拟主机 没有问题,但是 删除虚拟主机 后台显示删除成功的,但是实际在服务器上 文件夹 ftp iis站点 都没有被删除 是什么问题华众虚拟主机管理系统星外,华众,依然这三个虚拟主机管理系统中哪个好
韩国vps 俄罗斯vps 国外vps租用 高防dns 全球付 l5520 鲜果阅读 win8升级win10正式版 最好看的qq空间 godaddy域名证书 刀片服务器是什么 91vps 上海联通宽带测速 电信托管 常州联通宽带 无限流量 视频服务器是什么 电信宽带测速软件 江苏徐州移动 中国联通宽带测试 更多