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
轻云互联怎么样?轻云互联,广州轻云网络科技有限公司旗下品牌,2018年5月成立以来,轻云互联以性价比的价格一直为提供个人,中大小型企业/团队云上解决方案。本次轻云互联送上的是美国圣何塞cn2 vps(免费50G集群防御)及香港沙田cn2 vps(免费10G集群防御)促销活动,促销产品均为cn2直连中国大陆线路、采用kvm虚拟技术架构及静态内存。目前,轻云互联推出美国硅谷、圣何塞CN2GIA云服务器...
公司介绍成都随风云科技有限公司成立于2021年,是国内领先的互联网业务平台服务提供商。公司专注为用户提供低价高性能云计算产品,致力于云计算应用的易用性开发,并引导云计算在国内普及。目前公司研发以及运营云服务基础设施服务平台(IaaS),面向全球客户提供基于云计算的IT解决方案与客户服务,拥有丰富的国内BGP、双线高防、香港等优质的IDC资源。公司一直秉承”以人为本、客户为尊、永续创新&...
一年一度的黑色星期五和网络星期一活动陆续到来,看到各大服务商都有发布促销活动。同时RAKsmart商家我们也是比较熟悉的,这次是继双十一活动之后的促销活动。在活动产品中基本上沿袭双11的活动策略,比如有提供云服务器七折优惠,站群服务器首月半价、还有新人赠送红包等活动。如果我们有需要RAKsmart商家VPS、云服务器、独立服务器等产品的可以看看他们家的活动。这次活动截止到11月30日。第一、限时限...
linux内存管理为你推荐
域名代理怎样通过卖域名赚钱?域名服务域名服务器是什么?有什么作用网站空间商域名空间商怎么做100m网站空间网站空间100M和1000M有什么区别 ?虚拟主机控制面板虚拟主机管理面板与网站后台有什么区别?apache虚拟主机如何用Apache配置安全虚拟主机 - PHP进阶讨论深圳虚拟主机深圳鼎峰网络科技 虚拟主机空间怎么样虚拟主机排名IDC全国十强是哪几个服务商虚拟主机试用哪儿的虚拟主机可以试用??广西虚拟主机江西服务器托管,但要接入专线,问了很多代理都说不可以,如何解决?
vir 美国主机评测 gitcafe 中国特价网 宁波服务器 泉州电信 速度云 东莞数据中心 中国电信网络测速 畅行云 免费蓝钻 摩尔庄园注册 群英网络 可外链的相册 成都主机托管 godaddy空间 博客域名 privatetracker alexa世界排名 byebyelove 更多