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
在2014年发现原来使用VPS的客户需求慢慢的在改版,VPS已经不能满足客户的需求。我们开始代理机房的独立服务器,主推和HS机房的独立服务器。经过一年多的发展,我们发现代理的服务器配置参差不齐,机房的售后服务也无法完全跟上,导致了很多问题发生,对使用体验带来了很多的不便,很多客户离开了我们。经过我们慎重的考虑和客户的建议。我们在2015开始了重大的改变, 2015年,我们开始计划托管自己...
buyvm正式对外开卖第四个数据中心“迈阿密”的块存储服务,和前面拉斯维加斯、纽约、卢森堡一样,依旧是每256G硬盘仅需1.25美元/月,最大支持10T硬盘。配合buyvm自己的VPS,1Gbps带宽、不限流量,在vps上挂载块存储之后就可以用来做数据备份、文件下载、刷BT等一系列工作。官方网站:https://buyvm.net支持信用卡、PayPal、支付宝付款,支付宝付款用的是加元汇率,貌似...
PacificRack在本月发布了几款特价产品,其中最低款支持月付仅1.5美元,基于KVM架构,洛杉矶机房,PR-M系列。PacificRack简称PR,QN机房旗下站点,主要提供低价VPS主机产品,基于KVM架构,数据中心为自营洛杉矶机房,现在只有PR-M一个系列,分为了2个类别:常规(Elastic Compute Service)和多IP产品(Multi IP Server)。下面列出几款秒...
linux内存管理为你推荐
美国vps服务器请问国外VPS服务器去哪里买呀,急求?拜托了各位 谢谢cm域名注册.Cm是什么域名 网址尾部是.CM的是哪里的网址?哪可以注册?vps虚拟主机请通俗解析一下虚拟主机,VPS和云主机?它们各有什么用途?vps主机vps主机是什么?代理主机主机做成代理服务器,其他局域网内的电脑必须通过我的这个网络出去云服务器租用谁知道租用服务器、云主机去哪里租?服务器租用费用价格是多少呀免备案虚拟空间想买个免备案的虚拟主机,不知道哪里的好点虚拟空间哪个好虚拟空间哪个好美国网站空间论坛选择空间可以选美国网站空间吗?asp网站空间ASP空间是什么?
上海虚拟主机 美国linux主机 免费com域名申请 com域名抢注 sharktech 国外主机 inmotionhosting pccw koss 42u标准机柜尺寸 512au 圣诞节促销 网通ip 架设服务器 web服务器的架设 789电视网 php服务器 镇江高防 域名和主机 alexa搜 更多