系统编程unix技术ch12_第1页
系统编程unix技术ch12_第2页
系统编程unix技术ch12_第3页
系统编程unix技术ch12_第4页
系统编程unix技术ch12_第5页
已阅读5页,还剩11页未读, 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

《UNIX高级系统技术OCRbydjq@SMTH ing/UNIX12 绍虚存系统。内存管理子进程的逻辑(虚)页与实际的物理内存之间的映射。当请求 页的实际物理位置是无关紧要的。4.3BSD中的memall()和mem(),以及SVR4中的get_page()和page()就是这种所谓的页面级分配器的一种实现。12-1内核中的内存分配器·SVR4proc,V器来实现这些功能。需要一套独立的机制来实现更细粒度上的内存分配。一个简单的解程序中的clists结构。某些表过于小,这些表就很可能溢出,并使整个系统在没有任何征兆的情况下。如果相接下来的章节中,首先对这类分配器的功能和评测标准进行描述。,KMA)处理动态内存分配请求。这些请求是由诸如路径名分析允许两个子系统间可以双向借用页面,分页系统也可以从KMA中借用空闲页面。KMA得多。这主要是碎块的问题,尽管有足够的内存,但它们并不是连续的一块,分配100%,而实际上,50%的使用率就是可以接受的了[Korn85]。造成内存浪费的主要因标准C语言库用户级内存管理中的malloc()和()相仿的接口。void*malloc(size_tnbytes);void(void*ptr);释放内存的模块可能根本就不知道分配内存的大小。如果KMA可以这些信息,将大大简允许客户改变分配空间的大小(例如realloc())也是很有用的。必须的。对于大多数系统而言,长字对齐就可以了,但在像DECAlphAXP[DEC92]源映射图只有一个项,它的base就是内存池的基址,而size就是内存池的大小(见图·最先匹配从第一个可以满足请求的空闲块中分配内存。这是最快的算法,但不利于减少·最佳匹配选择可满足请求的空闲块中最小的一个分配内存。该策略的缺点是可能会造成·匹配如果没有正合适的空闲块,选择可满足请求的空闲块中最大的一个。这看上去进行了详细的分析。UNIX使用最先匹配策略。offset_trmalloc(size); /*returnsoffsetofallocatedregion*/voidrm(base,size);12-2的要求先将请求取整到4或8的倍数。和消息的数据区。4.3BSD的虚存子系统也使用该算法管理映射用户空间的页表(请参看13.4.2小节)。以满足这一点。在9.5节中描述的快速文件系统(FFS)就使用该方法的变体来管理也可以存放内存块的大小,这有助于捕捉某些BUG,但需要()例程通过该值计算出空12-32内存。()将指针减去4得到头结构的指针,再从头结构中获得空闲表的指针,并将该内尺寸的malloc()请求时有3种可能:每法都各有长短,要根据实际情况来选择合适的方法。例如,内核可以在分配请漫长的线性搜索过程,彻底去除了碎片问题。在存在可用的内存块时,算法的情况性能例如,一个512字节的请求,需要分配1024个字节约内存块。12-1Malloc()的初始实现void*malloc(size){intndx= /*listindexintbufsize=1<<MINPOWER;/*sizeofsmallestbuffer*/size+=4; /*accountofheader*/assert(size<=bufsize<<=}.../*atthispoint,ndxistheindexoftheappropriatelist}KirkMcKusickMichaelKarels2[McKu88],许多McKusick-Karels·空闲相应的kmemsizes·被划分为特定大小的内存块kmemsizes[·kmemsizes[]的指针。()例程将内存块地址低位掩掉获得页面基址,在通过对应的kmemsizes[]元素对malloc()的调用用一个宏来替代。对请求的尺寸进行取整(分配的内存块无头信malloc()函数为请求分实例12-2McKusick-Karels分配器#defineNDX(size)\(size)>128\?(size)>256?4:3 #define registerstructtreelisthdr*tlh; if(size<=512&&\(flh=listarr[NDX(size)])!=NULL) {\space=(cast)flh->next; flh->next=*(caddr_t*)space;}elsespace=(cast)malloc(size,flags);}12-5)10241,则相应内存块正在使用。伙伴系统还为每一种可能大小的12-5伙伴系统分配(256):将内存块对分为两个伙伴——AA'A512ABBB256B分配(128):128256B'。将B'CCC'128C。分配(64):发现64128CC'分为DD',D'64D12-5就是此时的情形。分配(128):发现128256512加入128字节空闲链表,返回F。):将12-6伙伴系统,阶段释放(D,64):分配器注意到DDD,C',然后又12-7所示。的基址为256的内存块,其伙伴基址为0。个缺点是编程接口。释放例程需要内存块的基址和大小。此外,分配器只能释放整个内存块。简单伙伴系统的最大问题是不断进行的和合并造成的性能不佳。正常情况下,内存的情况下,合并不会带来什么好处,相反却浪费了很多时间。合并仅当突况下才是必须处理函数这样的。时间临界函数可能会调用分配器,有必要对情况下的分配器的行为进行适当的控制。希望有一条中庸之道,既延缓合并,又不等到非做不可的时候才去做,必须将合并的代价均匀地分散到若干请求中。[Lee89]提出了内存块类的概念,并基于其上Lazy1,标记内存块为局域空闲(可以在该类中分配,但不能合并)。2NAN=A+L+·reclaiming·accelerated消耗进入不稳定状态,分配器必须更快地进行合并。决定内存块类状态的关键参数称为slack,定义为slack=N-2L-修改slack的值,重新计算该参数。存块放在队尾。这样,延迟内存块优先被分配,这正是所希望的(分配它们不需要更新位空闲链表均处于lazy状态,不花费任何时间进行合并或。即使某个空闲链表进入accelerated状态,至多合并两个延迟内存块,至多比基本伙伴系统差1倍。16KB的内存,分配大小从512一lGK。在稳定状态下两种类型的活动内存池有很多。在 在porttranslationsportsets(6104DEC93],但它们都有自己的zone。此外,还有一组为2的整次幂zone,供那些不需要私有对象池的各种客户使用。Zone一开始都是通过页面级分配器生成的,需要时可以由页面级分配器获得的内zoneofzoneszoneofzonesstructzone。是zoneofzones,其他zone都是从这里分配的,为了不导致情况下某些操作的异常行为,收集在运行。分配器一个称为12-8zoneobj=void*zalloc(structzone*voidz(structzone*z,void*块静态配置的内存,通过它来创建zoneofzones。zone的所有页面。收集在结束以前不会释放CPU资源,这会影响系统的反应能力。统中对锁的竞争,CPU经常处于等待锁被释放的状态下。图12-9给出了分配器的设计原理。最低层(per-CPU层)的操作速度最快,而最2个空闲块)。这避免了不必要的链表操作。为了实现成组方式移动,per-CPU层两个链表——main和aux,分配和释放操作主mainauxaux增加target就会减少对globalcache的次数,但同时使per-CPU层保存了的空闲块,global层一组全局的2次幂空闲链表。每一个链表都分成若干个target空闲12-9反,coalesce-to层也可以从分页系统获得页面,生成新的内存块。口,允许分配器与分页系统间交换内存。per-CPU了per-CPU层与global层间的内存块交换。的地方。Mach作由于太消耗计算资源,而不得不由一个独立的任务完成。在Dynix中,每次内存块被的,即仅从per-CPU层进行分配。这份报告没有给出更一般的结果。对象复用,硬件cache使用率和分配器footprint。l.分配内存 内核对象通常比较复杂,包含诸如计数,链表头,互斥锁,条件变量等子对象。对UNIX[Bark90]中,内核仅在vv因此,就在释放v节点之前(析构阶段),它的链表又恢复到空状态。化计数为1。当所有释放后释放该对象。互斥锁其初始状态为状态,而且必如下计算将不同的地址映射到cache单元上:cachelocation=address%cache从内存中获取,并重写cache单元的内容。硬件cache不能有效地利用,并进而导致内存性能下降,这种问题在采用多条总线的分体器系统中会更为严重。例如,在SPARCcenter部分操作都总线0,造成了总线使用的不均衡。配器的性能。分配器内存是将覆盖那些“热”(活动的)cache行或TLB表项,它们应的内存池,并简单地从空闲表中移走内存块。slab分配器也使用同样的原理控制slabzone12-10)。前端与客户直接交互。客户从缓存中获取12-10slabcachep=kmem_cache_create(name,size,align,ctor,objp=kmem_cache_alloc(cachep,kmemcache_(cachep,slabslab当页面级分配器需要恢复内存时,调用kmem_cache_reap()。该函数查找所有对象均为slab先来看看小对象,每个小对象可以存放在一个页面上。页面分为三部分——kmem_slab结构,对象集,不用的空间(见图和13个空闲列表指针)。这部分不使用空间又分成两部分,下面将给出解释。12-11小对象的slab类对象有良好的基址分布,从而带夹均衡和高效的硬件cache和总线使用率。slabaddress=objectaddress%slab成一个有序的双向链表,完动的slab(所有对象均在使用)排,部分活动的slab居slabslab。在页面级分配器回收内存时,它检查缓存的队尾,并删去空闲的slab。kmem_bafctlobject到kmem_bufctl结构的反向转换。配

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论