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
今天有网友提到自己在Linux服务器中安装VNC桌面的时候安装都没有问题,但是在登录远程的时候居然有出现灰色界面,有三行代码提示"Accept clipboard from viewers,Send clipboard to viewers,Send primary selection to viewers"。即便我们重新登录也不行,这个到底如何解决呢?这里找几个可以解决的可能办法,我们多多尝试。...
CloudCone商家在前面的文章中也有多次介绍,他们家的VPS主机还是蛮有特点的,和我们熟悉的DO、Linode、VuLTR商家很相似可以采用小时时间计费,如果我们不满意且不需要可以删除机器,这样就不扣费,如果希望用的时候再开通。唯独比较吐槽的就是他们家的产品太过于单一,一来是只有云服务器,而且是机房就唯一的MC机房。CloudCone 这次四周年促销活动期间,商家有新增独立服务器业务。同样的C...
特网云官網特网云服务器在硬件级别上实现云主机之间的完全隔离;采用高端服务器进行部署,同时采用集中的管理与监控,确保业务稳定可靠,搭建纯SSD架构的高性能企业级云服务器,同时采用Intel Haswell CPU、高频DDR4内存、高速Sas3 SSD闪存作为底层硬件配置,分钟级响应速度,特网云采用自带硬防节点,部分节点享免费20G防御,可实现300G防御峰值,有效防御DDoS、CC等恶意攻击,保障...
linux内存管理为你推荐
cm域名注册听说新开放注册.CM域名,价格贵不贵好不好的?asp主机如何用ASP代码实现虚拟主机info域名注册info域名什么时候出现的?域名主机域名和主机IP地址有什么关系域名购买如何购买域名?网站空间域名网站制作 域名和空间免费域名空间求速度快的 免费空间 带域名的 谢谢大家域名备案域名怎么进行备案?国外网站空间怎么样把网站空间放到国外去?什么是虚拟主机虚拟主机是什么
网络域名 godaddy域名解析教程 花生壳域名贝锐 拜登买域名批特朗普 openv 赵容 主机评测 堪萨斯服务器 香港服务器99idc diahosting linode代购 l5520 idc评测网 国外空间服务商 密码泄露 免费静态空间 网站实时监控 全能主机 卡巴斯基免费试用版 联通网站 更多