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
春节期间我们很多朋友都在忙着吃好喝好,当然有时候也会偶然的上网看看。对于我们站长用户来说,基本上需要等到初八之后才会开工,现在有空就看看是否有商家的促销。这里看到来自HMBcloud半月湾服务商有提供两款春节机房方案的VPS主机88折促销活动,分别是来自洛杉矶CN2 GIA和日本CN2的方案。八八折优惠码:CNY-GIA第一、洛杉矶CN2 GIA美国原生IP地址、72小时退款保障、三网回程CN2 ...
提速啦 成立于2012年,作为互联网老兵我们一直为用户提供 稳定 高速 高质量的产品。成立至今一直深受用户的喜爱 荣获 “2021年赣州安全大赛第三名” “2020创新企业入围奖” 等殊荣。目前我司在美国拥有4.6万G总内存云服务器资源,香港拥有2.2万G总内存云服务器资源,阿里云香港机房拥有8000G总内存云服务器资源,国内多地区拥有1.6万G总内存云服务器资源,绝非1 2台宿主机的小商家可比。...
目前在标准互联这边有两台香港云服务器产品,这不看到有通知到期提醒才关注到。平时我还是很少去登录这个服务商的,这个服务商最近一年的促销信息比较少,这个和他们的运营策略有关系。已经从开始的倾向低价和个人用户云服务器市场,开始转型到中高端个人和企业用户的独立服务器。在这篇文章中,有看到标准互联有推出襄阳电信高防服务器100GB防御。有三款促销方案我们有需要可以看看。我们看看几款方案配置。型号内存硬盘IP...
linux内存管理为你推荐
注册国际域名怎么申请国际域名vps主机vps主机用途有哪些?海外主机美国主机与国内主机有哪些区别虚拟主机申请域名申请以及虚拟主机香港虚拟空间香港虚拟主机空间哪家最好100m网站空间100M网站空间可以存多少张图片和多少文字?免备案虚拟主机请问哪里好一点的免备案的虚拟主机?windows虚拟主机在windows 系统上装虚拟机有什么好的建议jsp虚拟主机java虚拟主机空间怎么选择,国内jsp虚拟主机比较稳定,现在java项目做好后需要推荐一下吧安徽虚拟主机华夏网络科技有限公司的介绍
百度域名 vps代购 GGC burstnet pw域名 日志分析软件 韩国网名大全 vip域名 paypal注册教程 电信托管 华为云盘 中国电信测速器 中国域名 万网空间 腾讯服务器 alexa世界排名 建站行业 wordpress安装 主机托管 主机响 更多