关闭

关闭

封号提示

内容

首页 Linux Memory Manager.ppt

Linux Memory Manager.ppt

Linux Memory Manager.ppt

上传者: kenneth2078 2011-06-21 评分 3 0 37 5 168 暂无简介 简介 举报

简介:本文档为《Linux Memory Managerppt》,可适用于IT/计算机领域,主题内容包含LinuxMemoryManagerLinuxMemoryManagerActionsMicroelectronicsCo,Ltd柯锦玲Agenda符等。

LinuxMemoryManagerLinuxMemoryManagerActionsMicroelectronicsCo,Ltd柯锦玲AgendaAgendaLinux对外提供的内存管理接口linux内存镜像图Linux内存管理算法介绍Linux如何防止内存碎片LinuxImageLinuxImage蓝色字体部分可用空间Linux如何防止内存碎片Linux如何防止内存碎片内存碎片内部碎片:系统为了满足一小段内存区(连续)的需要不得不分配了一大区域连续内存给它从而造成了空间浪费外部碎片系统虽有足够的内存但却是分散的碎片无法满足对大块“连续内存”的需求Linux如何防止内存碎片Linux如何防止内存碎片linux减少外部碎片伙伴系统(buddy算法)把内存块按大小分组管理一定程度上减轻了外部碎片的危害因为页框分配不在盲目而是按照大小依次有序进行不过伙伴关系只是减轻了外部碎片但并未彻底消除,但是伙伴系统同时又带来很多的内部碎片linux减少外部碎片SLAB,SLUB,SLOB分配器使得一个页面内众多小块内存可独立被分配使用避免了内部分片节约了空闲内存Linux如何防止内存碎片Linux如何防止内存碎片linux内存管理层次关系图Linux如何防止内存碎片Linux如何防止内存碎片linux内存管理层次关系图Linux内存管理算法介绍Linux内存管理算法介绍BuddySystem算法原理BuddySystem是一种经典的内存管理算法。在Unix和Linux操作系统中都有用到。其作用是减少存储空间中的空洞、减少碎片、增加利用率。避免外碎片的方法有两种:a利用分页单元把一组非连续的空闲页框映射到连续的线性地址区间。b开发适当的技术来记录现存的空闲连续页框块的情况以尽量避免为满足对小块的请求而把大块的空闲块进行分割。基于下面三种原因内核选择第二种避免方法:a在某些情况下连续的页框确实必要。b即使连续页框的分配不是很必要它在保持内核页表不变方面所起的作用也是不容忽视的。假如修改页表则导致平均访存次数增加从而频繁刷新TLB。c通过M的页可以访问大块连续的物理内存相对于K页的使用TLB未命中率降低加快平均访存速度。buddy算法将所有空闲页框分组为个块链表每个块链表分别包含,,,,,,,,,,个连续的页框每个块的第一个页框的物理地址是该块大小的整数倍。如大小为个页框的块其起始地址是*^的倍数。例假设要请求一个个页框的块算法先检查个页框的链表是否有空闲块如果没有则查个页框的链表有则将个页框的块分裂两份一份使用一份插入个页框的链表。如果还没有就查个页框的链表有的话就分裂为一个使用剩余两个插入对应链表。如果在还没查到则返回出错信号。回收过程相反staticinlinestructpage*allocpages(gfptgfpmask,unsignedintorder)voidfreepages(structpage*page,unsignedintorder)分配内存的单位为页面数,分配时候传入order值,order为,,,,n分别分配,,,^n个页面伙伴系统(Buddy算法)分配的页面物理上是连续的,因此使用伙伴系统分配的内存大小最大为^*PAGESIZE=K*K=Munsignedlonggetfreepages(gfptgfpmask,unsignedintorder)voidfreepages(unsignedlongaddr,unsignedintorder)Buddy算法虽然能很好的减少外部碎片的产生,但是他却可用导致很多的内部碎片slabslobslub的作用:以页为最小单位分配内存对于内核管理系统物理内存来说的确比较方便但内核自身最常使用的内存却往往是很小(远远小于一页)的内存块比如存放文件描述符、进程描述符、虚拟内存区域描述符等行为所需的内存都不足一页。这些用来存放描述符的内存相比页面而言就好比是面包屑与面包。一个整页中可以聚集多个这种这些小块内存而且这些小块内存块也和面包屑一样频繁地生成销毁。为了满足内核对这种小内存块的需要Linux系统采用了一种被称为slab分配器的技术。Slab分配器的实现相当复杂但原理不难其核心思想就是“存储池”的运用。内存片段(小块内存)被看作对象当被使用完后并不直接释放而是被缓存到“存储池”里留做下次使用这无疑避免了频繁创建与销毁对象所带来的额外负载。slab分配器的主要结构SLUBSLUB中的SLAB内存管理代码将被SLUB代替。SLAB是经典的管理内核的内存的代码,但是slab维护了大量的对象队列这些队列虽然可以很快地被分配但是过于复杂而且维护所占用的空间会随着系统节点的增加而急剧增长。slub就是作为slab的可替代选项出现的。slub是一种不使用队列的分配器。slub取消了大量的队列和相关维护费用获得了极大的性能和伸缩性提高并在总体上简化了slab结构使用了基于每CPU的缓存同时保留了slab的用户接口而且slub还提供了强大的诊断和调试能力slobslobslob是一个相对简单一些的分配器主要使用在小型的嵌入式系统。在选择了CONFIGEMBEDDED后就可以选用CONFIGSLOB选项使用SLOB分配器中。slob是一个经典的KRUNIX堆分配器(想我们目前ucos上面的malloc)其具有一个slab模拟层和被slab替代的linux原来的kmalloc分配器比较相似比slab更有空间效率尺寸更小但是依然存在碎片和难于扩展(对所有操作都简单地上锁)的问题只适用于小系统。slob获得的是已经对齐的对象。slob在MIPS上的粒度是字节。slob堆是一个单向列表连接了从getfreepage获得的页面从堆上按照firstfit的原则依照需求增长和分配。vmalloc避免外部分片的最终思路还是落到了如何利用不连续的内存块组合成“看起来很大的内存块”这里的情况很类似于用户空间分配虚拟内存内存逻辑上连续其实影射到并不一定连续的物理内存上。Linux内核借用了这个技术允许内核程序在内核地址空间中分配虚拟地址同样也利用页表(内核页表)将虚拟地址影射到分散的内存页上。以此完美地解决了内核内存使用中的外部分片问题。内核提供vmalloc函数分配内核虚拟内存该函数不同于kmalloc它可以分配较Kmalloc大得多的内存空间(可远大于K但必须是页大小的倍数)但相比Kmalloc来说Vmalloc需要对内核虚拟地址进行重影射必须更新内核页表因此分配效率上要低一些(用空间换时间))Mipsbit存储器映射图在mips底下使用,ksegG大小空间,从xC~xFFFFFFFF,也就是说vmalloc返回的地址值,会落在xC~xFFFFFFFF上Mipslinux使用的是二级映射将线性地址转换为物理地址PGD(pagedirecory),页面目录表,占用bit每一PGD项占用字节,所以页表目录大小为KB,正好一页PTE(pagetableentry),页面目录入口表,占用bit每一PTE项占用字节,所以页表(PTE)大小为KB,正好一页每一PGD项,(需要有一个页表(PTE))可以映射^=MB的空间每一PGD项,对应一个PTE(pagetableentry),页面目录入口表Vmalloc:调用图内核提供内存管理接口接口:gfpmask:GFPATOMIC用来从中断处理和进程上下文,软中断,持有自旋锁以及其他不能睡眠(阻塞)的地方分配内存从不睡眠GFPKERNEL内核内存的正常分配可能睡眠Slobslabslub提供接口:staticstructkmemcache*skbuffheadcachereadmostlyskbuffheadcache=kmemcachecreate("skbuffheadcache",sizeof(structskbuff),,SLABHWCACHEALIGN|SLABPANIC,)SLABHWCACHEALIGN:指定cache对齐(cacheline对齐,如字节对齐)SLABPANIC:指示创建失败时候,系统halt除非你觉得分配的内存结构体会频繁地生成销毁,否则请直接使用kmalloc分配空间除非你觉得分配的内存结构体会频繁地生成销毁,否则请直接使用kmalloc分配空间例子:分配:skb=kmemcacheallocnode(cache,gfpmask,node)释放:kmemcachefree(skbuffheadcache,skb)Vmalloc:不能在中断中使用:void*vmalloc(unsignedlongsize)voidvfree(constvoid*addr)Kmalloc:staticinlinevoid*kmalloc(sizetsize,gfptflags)voidkfree(constvoid*objp)ActionsMicroelectronicsCo,Ltd

精彩专题

职业精品

上传我的资料

热门资料

资料评价:

/ 24
所需积分:1 立即下载

意见
反馈

返回
顶部

Q