资源描述:
《Linux内存管理 Memory Manager》由会员上传分享,免费在线阅读,更多相关内容在行业资料-天天文库。
1、LinuxMemoryManagerActionsMicroelectronicsCo.,Ltd.柯锦玲2009-10-21AgendaLinux对外提供的内存管理接口linux内存镜像图313234Linux内存管理算法介绍33Linux如何防止内存碎片LinuxImage蓝色字体部分可用空间Linux如何防止内存碎片内存碎片内部碎片:系统为了满足一小段内存区(连续)的需要,不得不分配了一大区域连续内存给它,从而造成了空间浪费外部碎片系统虽有足够的内存,但却是分散的碎片,无法满足对大块“连续内存”的需求Linux如何防止内存碎片linux减少外部碎片伙伴系
2、统(buddy算法)把内存块按大小分组管理,一定程度上减轻了外部碎片的危害,因为页框分配不在盲目,而是按照大小依次有序进行,不过伙伴关系只是减轻了外部碎片,但并未彻底消除,但是伙伴系统同时又带来很多的内部碎片linux减少外部碎片SLAB,SLUB,SLOB分配器使得一个页面内众多小块内存可独立被分配使用,避免了内部分片,节约了空闲内存Linux如何防止内存碎片linux内存管理层次关系图1Linux如何防止内存碎片linux内存管理层次关系图2Linux内存管理算法介绍BuddySystem算法原理BuddySystem是一种经典的内存管理算法。在Unix
3、和Linux操作系统中都有用到。其作用是减少存储空间中的空洞、减少碎片、增加利用率。避免外碎片的方法有两种:a.利用分页单元把一组非连续的空闲页框映射到连续的线性地址区间。b.开发适当的技术来记录现存的空闲连续页框块的情况,以尽量避免为满足对小块的请求而把大块的空闲块进行分割。基于下面三种原因,内核选择第二种避免方法:a.在某些情况下,连续的页框确实必要。b.即使连续页框的分配不是很必要,它在保持内核页表不变方面所起的作用也是不容忽视的。假如修改页表,则导致平均访存次数增加,从而频繁刷新TLB。c.通过4M的页可以访问大块连续的物理内存,相对于4K页的使用,
4、TLB未命中率降低,加快平均访存速度。buddy算法将所有空闲页框分组为11个块链表,每个块链表分别包含1,2,4,8,16,32,64,128,256,512,1024个连续的页框,每个块的第一个页框的物理地址是该块大小的整数倍。如,大小为16个页框的块,其起始地址是16*2^12的倍数。例,假设要请求一个128个页框的块,算法先检查128个页框的链表是否有空闲块,如果没有则查256个页框的链表,有则将256个页框的块分裂两份,一份使用,一份插入128个页框的链表。如果还没有,就查512个页框的链表,有的话就分裂为128,128,256,一个128使用,剩
5、余两个插入对应链表。如果在512还没查到,则返回出错信号。回收过程相反staticinlinestructpage*alloc_pages(gfp_tgfp_mask,unsignedintorder)void__free_pages(structpage*page,unsignedintorder)分配内存的单位为页面数,分配时候传入order值,order为0,1,2,..,n分别分配1,2,4,2^n个页面伙伴系统(Buddy算法)分配的页面物理上是连续的,因此使用伙伴系统分配的内存大小最大为2^10*PAGESIZE=4K*4K=4Munsigned
6、long__get_free_pages(gfp_tgfp_mask,unsignedintorder)voidfree_pages(unsignedlongaddr,unsignedintorder)Buddy算法虽然能很好的减少外部碎片的产生,但是他却可用导致很多的内部碎片slab/slob/slub的作用:以页为最小单位分配内存对于内核管理系统物理内存来说的确比较方便,但内核自身最常使用的内存却往往是很小(远远小于一页)的内存块——比如存放文件描述符、进程描述符、虚拟内存区域描述符等行为所需的内存都不足一页。这些用来存放描述符的内存相比页面而言,就好比
7、是面包屑与面包。一个整页中可以聚集多个这种这些小块内存;而且这些小块内存块也和面包屑一样频繁地生成/销毁。为了满足内核对这种小内存块的需要,Linux系统采用了一种被称为slab分配器的技术。Slab分配器的实现相当复杂,但原理不难,其核心思想就是“存储池”的运用。内存片段(小块内存)被看作对象,当被使用完后,并不直接释放而是被缓存到“存储池”里,留做下次使用,这无疑避免了频繁创建与销毁对象所带来的额外负载。slab分配器的主要结构SLUB2.6.22中的SLAB内存管理代码将被SLUB代替。SLAB是经典的管理内核的内存的代码,但是slab维护了大量的对象
8、队列,这些队列虽然可以很快地被分配,但是过于复杂,而