linux内存管理了解

上传人:ji****72 文档编号:50866619 上传时间:2018-08-11 格式:PPT 页数:25 大小:835.50KB
返回 下载 相关 举报
linux内存管理了解_第1页
第1页 / 共25页
linux内存管理了解_第2页
第2页 / 共25页
linux内存管理了解_第3页
第3页 / 共25页
linux内存管理了解_第4页
第4页 / 共25页
linux内存管理了解_第5页
第5页 / 共25页
点击查看更多>>
资源描述

《linux内存管理了解》由会员分享,可在线阅读,更多相关《linux内存管理了解(25页珍藏版)》请在金锄头文库上搜索。

1、Linux内存管理认识目录内存管理叙述内存管理结构分页机制内存管理算法伙伴算法Slab Linux内存一部分永久地分配给系统,作为内核代码段和只读数据段的载体,用来 存放内核程序代码以及静态数据,这部分称为操作系统的静态存储器(static memory)。其它部分,则在Linux的管理下,进行内存的动态申请和释放,称为动态 存储器(dynamic memory)。Linux采用页作为内存管理的基本单位,其采用的标准的页面大小为4KB因为4KB是大多数磁盘块大小的倍数,传输效率高,管理方便,无需考虑 PSE,PAE 保留 内核映象 动态内存0 0x100000 start_mem end_me

2、m Linux内存进程创建后我们可以给页目录表的表项值都填0,CPU在查找页表时,如果表项 的内容为0,则会引发一个缺页异常,进程暂停执行,Linux内核这时候可以通过一系列 复杂的算法给分配一个物理页,并把物理页的地址填入表项中,进程再恢复执行。当 然进程在这个过程中是被蒙蔽的,它自己的感觉还是正常访问到了物理内存。内存层次图内存层次图分页机制分页机制下,Linux物理内存分配和回收的基本单位 是物理页(i386体系结构下是4K),采用伙伴算法,可快 速分配连续的物理页面,也解决了外碎片问题。内存分配都是先分配虚拟内存,同时内核空间上还会 先用slab模式在虚拟地址按字节分配空间,再用页机制

3、映 射到物理内存。Linux页式管理Linux页式管理这四级分别为: 1.页全局目录(Page Global Directory):即pgd,是多级页表 的抽象最高层。 2.页上级目录(Page Upper Directory):即pud。3.页中间目录(Page Middle Directory):即pmd,是页表的中 间层。 4.页表(Page Table Entry):即pte。页描述符内核使用页描述符来跟踪管理物理内存,每个物理页面都用一个页描述符表示页描述符用struct page的结构描述,所有物理页面的描述符,组织在mem_map 的数组中,page结构则是对物理页面进行描述的一

4、个数据结构vmalloc()与 kmalloc()之区别都是内核代码在内核空间分配内存(虚拟内存),但分配的 内存在内核空间的不同位置。 kmalloc()分配的内存处于3GBhigh_memory之间, vmalloc()分配的内存在VMALLOC_START4GB之间, 地址连续性不同。 kmalloc虚拟地址连续,物理地址也连续。硬件设备使用的内存常需 要此种。很多内核代码出于性能的考虑常用该方式获得内存;还 比如内核中的驱动程序。 vmalloc虚拟地址连续,但通过分页映射的物理内存不保证物理地址 连续。软件程序可使用此类内存。往往在需要大块内存不得已时 才用此方式获得内存,如动态装载

5、一个模块到内核中时。Linux 内存管理算法介绍Buddy System算法原理Buddy System是一种经典的内存管理算法。在Unix和Linux操作系统中都有用到。其作用 是减少存储空间中的空洞、减少碎片、增加利用率。避免外碎片的方法有两种:a.利用分页单元把一组非连续的空闲页框映射到连续的线性地址区间。b.开发适当的技术来记录现存的空闲连续页框块的情况,以尽量避免为满足对小块的请求而把大块 的空闲块进行分割。linux内核选择第二种避免方法:u buddy算法将所有空闲页框分组为11个块链表,每个块链表分别包含 1,2,4,8,16,32,64,128,256,512,1024个连续

6、的页框,每个块的第一个页框的物理地址是该块大小的 整数倍。如,大小为16个页框的块,其起始地址是16*212的倍数。u例,假设要请求一个128个页框的块,算法先检查128个页框的链表是否有空闲块,如果没有则查 256个页框的链 表,有则将256个页框的块分裂两份,一份使用,一份插入128个页框的链表。如果 还没有,就查512个页框的链表,有的话就分裂为 128,128,256,一个128使用,剩余两个插入 对应链表。如果在512还没查到,则返回出错信号。u回收过程相反伙伴算法释放过程满足以下条件的两个块称为伙伴:两个块的大小相同两个块的物理地址连续伙伴算法把 满足以上条件的两个空块合并为一个块

7、,如果合并后的块 还可以跟相邻的块进行合并,那么该算法就继续合并。伙伴算法Linux通过伙伴算法管理和分配页,Linux使用了3个Zone, 每个Zone由一个自己的伙伴系统来管理:ZONE_DMA 包含可以用来执行DMA操作的内存ZONE_NORMAL 包含可以正常映射到虚拟地址的内存区域ZONE_HIGHMEM 永久映射到内核地址空间的内存区域原理Linux的伙伴算法把所有的空闲页面分为10个块组,每组中块的大小是2的幂次方个页 面,例如,第0组中块的大小都为20 (1个页面),第1组中块的大小为都为21(2个页 面),第9组中块的大小都为29(512个页面)。也就是说,每一组中块的大小是

8、相同 的,且这同样大小的块形成一个链表。伙伴算法分配过程假设要求分配的块其大小为128个页面,该算法先在块大 小为128个页面的链表中查找,看是否有这样一个空闲块 。如果有,就直接分配;如果没有,该算法会查找下一个 更大的块,在块大小为256个页面的链表中查找一个空闲 块。如果存在这样的空闲块,内核就把这256个页面分为 两等份,一份分配出去,另一份插入到块大小为128个页 面的链表中。如果在块大小为256个页面的链表中也没有 找到空闲页块,就继续找更大的块,即512个页面的块。 如果存在这样的块,内核就从512个页面的块中分出128 个页面满足请求,然后从384个页面中取出256个页面插 入

9、到块大小为256个页面的链表中。然后把剩余的128个 页面插入到块大小为128个页面的链表中。slab为了满足内核对这种小内存块的需要,Linux系统采用了一种被称为 slab分配器的技术。Slab分配器的实现 相当复杂,但原理不难,其核心 思想就是“存储池”的运用。内存片段(小块内存)被看作对象,当被使用完 后,并不直接释放而是被缓存到“存储池”里,留做下 次使用,这无疑避 免了频繁创建与销毁对象所带来的额外负载。slab 分配器的主要结构Slab分配器linux采用了slab来管理小块内存的分配与释放slab可解决内碎片问题,因为很多数据结构请求分配的内 存大小不足以用一个页面那么大。缓冲

10、区slabslab对象Struct kmem_cache_tStruct kmem_slab_t主存中划出一片 区域。把这片区 域划分为多个块 ,每块就是一个 Slab每个Slab由一个或多个页 面组成,每个Slab中存放 的是同类型的对象频繁使用的数据结构可划分 为专用缓冲区,如存放一组 task_struct类型的对象使用频度低,占空不足一个 页面的数据结构可创建一组 通用缓冲区来处理。内核的虚拟内存分配回收函数slab专用缓存区: kmem_cache_alloc()、mem_cache_free() slab通用缓冲区: kmalloc( )、kfree( ) void *kmallo

11、c(size_t size,int flags); 这些函数是向slab分配器要虚拟空间,而slab根据情况再通过伙伴算法从内 存要物理页面。 kamlloc分配的内存块要由kfree释放。分配和回收要配对使用,避免内存泄 露和其他bug。 内核非连续内存区 内核程序通过slab不能获得大块内存,所以专门在内核空间保留一些空( VMALLOC_START4GB ),用vmalloc进行分配: void *vmalloc(unsigned long size)Slab分配器Slab将缓存分为两种: 专用高速缓存:用来存放内核使用的数据结构,例如: mm,skb,vm等等 普通高速缓存:存放一般的

12、数据,比如内核为指针分配一段内 存 注: 所有的高速缓存区都通过链表的方式组织在一起,它的首结 点是cache_chain 普通高速缓存将分配区分为32*(20),32*(21),32*(22) .32*(212)大小,共13个区域大小Slab分配器每个高速缓存都包含了一个 slabs 列表,这是一段连续的内 存块(通常都是页面)。存在 3 种 slab:slabs_full 完全分配的 slab slabs_partial 部分分配的 slab slabs_empty 空 slab,或者没有对象被分配 Slab分配器slab 列表中的每个 slab 都是一个连续的内存块(一个或 多个连续页),它们被划分成一个个对象。这些对象是从 特定缓存中进行分配和释放的基本元素。 注意: slab 是 slab 分配器进行操作的最小分配单位 缺页异常

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 行业资料 > 其它行业文档

电脑版 |金锄头文库版权所有
经营许可证:蜀ICP备13022795号 | 川公网安备 51140202000112号