Linux操作系统分析8 memory.ppt

上传人:s****8 文档编号:69347350 上传时间:2023-01-02 格式:PPT 页数:60 大小:2.22MB
返回 下载 相关 举报
Linux操作系统分析8 memory.ppt_第1页
第1页 / 共60页
Linux操作系统分析8 memory.ppt_第2页
第2页 / 共60页
点击查看更多>>
资源描述

《Linux操作系统分析8 memory.ppt》由会员分享,可在线阅读,更多相关《Linux操作系统分析8 memory.ppt(60页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。

1、Linux操作系统分析操作系统分析中国科学技术大学计算机系中国科学技术大学计算机系陈香兰(陈香兰(051287161312)Autumn 2010内存管理内存管理内存管理内存管理在前面已经提到:Linux如何有效地利用x86的分段和分页机制把逻辑地址转换为物理地址RAM的某些部分永久地分配给内核,用以存放内核代码以及静态数据RAM的其余部分称为动态存储器(dynamic memory)1/2/20233Linux OS AnalysisLinux内核的前内核的前512个页框(假定内核所需内存个页框(假定内核所需内存0:页已经分配给一个或多个进程或用户某些内核数据结构flags:页框状态,最多可

2、以有32个,每个使用一个位表示1/2/202311Linux OS Analysis页框状态页框状态1/2/202312Linux OS Analysis页描述符将会占用很大的一段空间页描述符将会占用很大的一段空间由于每个struct page结构小于64个字节,因此1MB的内存需要使用约4个页面来存放mem_map数组假若系统中存在512MB的内存,那么大约需要?1/2/202313Linux OS Analysis关于关于NUMA不考虑物理内存被划分为若干个node存取时间不等考虑CPU局部性Node使用数据结构pg_data_t描述每个node被划分成若干个zone1/2/202314L

3、inux OS Analysis存储区存储区(Memory Zones)在一个理想的体系结构中,一个页框就是一个物理存储单元,可以用于任何事情,例如存放内核数据/用户数据/缓存磁盘数据等实际上存在硬件制约:一些页框由于自身的物理地址的原因不能被一些任务所使用,例如ISA总线的DMA控制器只能对ram的前16M寻址在一些具有大容量ram的32位计算机中,CPU不能直接访问所有的物理存储器,因为线性地址空间不够1/2/202315Linux OS Analysiszone为了应付这种限制,Linux把具有同样性质的物理内存划分成区(zones)Linux把物理存储器划分为4个区ZONE_DMAZO

4、NE_DMA32 (未见用)ZONE_NORMALZONE_HIGHMEM参见枚举类型zone_typeZONE_DMAZONE_NORMALZONE_HIGHMEM物理内存016MB896MBMAX1/2/202316Linux OS AnalysisZONE_DMA 和ZONE_NORMAL区包含存储器的“常规”页,通过把它们映射到线性地址空间的3GB以上,内核就可直接访问而ZONE_HIGHMEN区中包含的存储器页面不能由内核直接访问MAXZONE_DMA ZONE_NORMALZONE_HIGHMEM物理内存016MB896MB线性空间3G3GB4GB3GB+16MB3GB+896MB

5、1/2/202317Linux OS Analysis每个zone使用struct zone表示关键:free_area小结:Mem_map、node、zone之间的关系1/2/202318Linux OS Analysis动态内存动态内存内存布局:动态内存及引用它的一些值1/2/202319Linux OS Analysis请求页框请求页框内核实现了一种底层的内存分配机制,并提供了几个接口供其他内核函数调用。分配:alloc_pages/alloc_page/alloc_pages_node/alloc_pages_current/_get_free_pages/_get_free_page

6、/_get_dma_pages/get_zeroed_page释放free_pages/_free_pages/free_page/_free_page1/2/202320Linux OS Analysis调用关键函数:调用关键函数:get_page_from_freelist1/2/202321Linux OS Analysis类似alloc_pages,但是返回第一个所分配页框的线性地址分配一个页框,返回值同上用来分配适用于DMA的页框1/2/202322Linux OS Analysis这个函数与_get_free_page基本等价,差别在于它把所分配页框中的页面数据全部清0。这在给用户

7、态的空间分配页框时候很有用。因为这个页框虽然是可被分配的,但是里面的数据可能包含了内核的一些敏感信息。清0,可以避免信息泄露1/2/202323Linux OS Analysis关于关于unsigned int gfp_mask指明可在何处并以何种方式查找空闲的页框GFP_ATOMIC,这种分配是高优先级的并且不能睡眠。一般在中断处理程序,下半部分和其他不能睡眠的场合下使用GFP_KERNEL,这是普通的分配模式,允许睡眠。一般在用户进程可能调用到的内核函数中使用,这个时候进程是可以安全的睡眠的GFP_DMA,设备驱动程序需要DMA内存时使用1/2/202324Linux OS Analysi

8、s关于关于gfp_mask的进一步解释的进一步解释标志位及其含义1/2/202325Linux OS Analysis1/2/202326Linux OS Analysis等等等等1/2/202327Linux OS Analysis释放页框释放页框如果page对应的页框不是被保留的页框(PG_reserved标志为0),就把描述符的count字段减1。如果count变为0,就调用释放与上一个函数类似,只是第一个参数是要释放的第一个页框的线性地址addr1/2/202328Linux OS Analysis在内核中释放页框时要非常小心,必须确保只释放了所请求的页框,否则内核可能会崩溃page=

9、_get_free_page(GFP_KERNEL,3);If(!page)/*如果内存不足,分配失败,必须在这里处理这个失败*/*现在page变量指向了8个连续页框的起始线性地址*/free_pages(page,3);/*现在页框被释放,不应该再对page中存放的线性地址进行操作*/1/2/202329Linux OS Analysis页框的管理页框的管理内核要为分配一组连续的页框建立一种稳定、高稳定、高效效的分配策略这种策略要解决(外部)碎片问题要解决(外部)碎片问题:频繁的请求和释放不同大小的一组连续页框,必然导致在物理页框中分散许多小块的空闲页框这样,即使有足够的空闲页框满足请求,但

10、要分配一个大块的连续页框可能就无法满足了1/2/202330Linux OS Analysis有两种办法两种办法可以避免这样的碎片利用MMU把一组非连续非连续的物理空闲页框映射到连续的线性地址空间使用一种适当的技术来记录现存的空闲连续页框的情记录现存的空闲连续页框的情况况,以尽量避免为满足对小块的请求而把大块的空闲块进行分割基于下面的原因,Linux内核首选第二种方法在某些情况下,必须使用连续的页框,如在某些情况下,必须使用连续的页框,如DMA尽量少的修改内核页表尽量少的修改内核页表1/2/202331Linux OS Analysisbuddy算法(算法(伙伴算法伙伴算法)Linux使用著名

11、的伙伴算法来解决碎片问题。把所有空闲页框分组为10(Linux2.6.26为11)个块链表,每个块链表分别包含大小为1,2,4,8,16,32,64,128,256和512个连续的页框每个块的第一个页框的物理地址是该块大小的整数倍l例如:大小为16个页框的块,其起址是164KB的倍数1/2/202332Linux OS Analysis伙伴的定义伙伴的定义例如:0和1是伙伴,1和2不是伙伴两个伙伴的大小必须相同,物理地址必须连续假定伙伴的大小为b那么第一个伙伴的物理地址必须是2b4KB对齐事实上伙伴是通过对大块的物理内存划分获得的假如从第0个页面开始到第3个页面结束的内存每次都对半划分,那么第

12、一次划分获得大小为2页的伙伴进一步划分,可以获得大小为1页的伙伴,例如0和1,2和3012301231/2/202333Linux OS Analysis数据结构数据结构Linux为每个zone使用各自独立的伙伴系统每个伙伴系统使用的主要数据结构为:空闲内存管理数组free_area1/2/202334Linux OS Analysismem_map数组前面介绍过的页描述符数组每个页描述符描述一个物理页框整个mem_map数组描述整个zone中的所有的物理内存空闲内存管理数组空闲内存按照伙伴管理的方法进行组织使用free_area结构1/2/202335Linux OS Analysis伙伴伙

13、伴当两个伙伴都为空闲的时候,就合并成一个更大的块该过程将一直进行,直到找不到可以合并的伙伴为止寻找伙伴给定一个要释放的空闲块找到其伙伴查看其状态:合并 or 不合并1/2/202336Linux OS Analysis举例举例假设有128MB的ram。128MB最多可以分成215=32768个页框,214=16384个8KB(2页)的块或213=8192个16KB(4页)的块,直至64个大小为512个页的块假设要请求一个大小为128个页框的块(0.5MB)。算法先free_area7中检查是否有空闲块(块大小为128个页框)若没有,就到free_area8中找一个空闲块(块大小为256个页框)

14、若存在这样的块,内核就把256个页框分成两等份,一半用作满足请求,另一半插入free_area7中如果在free_area8中也没有空闲块,就继续找free_area9中是否有空闲块。1/2/202337Linux OS Analysis若有,先将512分成伙伴,一个插入free_area8中,另一个进一步划分成伙伴,取其一插入free_area7中,另一个分配出去如果free_area9也没有空闲块,内存不够,返回一个错误信号1/2/202338Linux OS Analysis内存的分配与回收内存的分配与回收阅读相关代码关键:nr_free_free_one_page_rmqueuebuf

15、fered_rmqueueget_page_from_freelist_alloc_pages_internal_alloc_pagesfree_one_page_free_pages_ok_free_pagesmm/page_alloc.c1/2/202339Linux OS Analysis1/2/202340Linux OS Analysis1/2/202341Linux OS Analysis线 性 空 间(3GB4GB)页框管理小结页框管理小结页描述符Mem_map数组Zone空闲页框的管理线性空间(3GB)物理内存:highmemMem_map 数 组物理内存:DMA物理内存:No

16、rmalZone_dmaZone_normalZone_highmem空闲页框管理空闲页框管理空闲页框管理伙伴算法1/2/202342Linux OS Analysis2、内存区管理、内存区管理(memory area)单单分配页面的分配器肯定是不能满足要求的 内核中大量使用各种数据结构各种数据结构,大小从几个字节到几十上百k不等,都取整到2的幂次个页面那是完全不现实的 早期内核的解决方法早期内核的解决方法是提供大小为2,4,8,16,.,131056字节的内存区域 需要新的内存区域时,内核从伙伴系统申请页面,把它们划分成一个个区域,取一个来满足需求 如果某个页面中的内存区域都释放了,页面就交

17、回到伙伴系统 1/2/202343Linux OS Analysis但这种分配方法有许多值得改进的地方:不同的数据类型不同的数据类型用不同的方法分配内存可能提高效率。比如需要初始化的数据结构,释放后可以暂存着,再分配时就不必初始化了 内核的函数常常重复地使用重复地使用同一类型的内存区,缓存缓存最近释放的对象可以加速分配和释放 对内存的请求可以按照请求频率请求频率来分类,频繁使用的类型使用专门的缓存,很少使用的可以使用通用缓存使用2的幂次大小的内存区域时硬件高速缓存冲突硬件高速缓存冲突的概率较大,有可能通过仔细安排内存区域的起始地址来减少硬件高速缓存冲突 缓存缓存一定数量的对象可以减少对budd

18、y系统的调用,从而节省时间并减少由此引起的硬件高速缓存污染 1/2/202344Linux OS AnalysisLinux2.6.26中中SLOB Allocator:Simple List Of BlocksNUMASlabSlub:slab的一个变种Kmalloc/kfree本课介绍基本的slab算法算法1/2/202345Linux OS Analysisslab分配器分配器slab分配器体现了这些改进思想slab分配器把内存区看成对象把内存区看成对象slab分配器把对象分组放进高速缓存把对象分组放进高速缓存。每个高速缓存都是同种类型内存对象的一种每个高速缓存都是同种类型内存对象的一种

19、“储备储备”l例如当一个文件被打开时,存放相应“打开文件”对象所需的内存是从一个叫做filp(file pointer)的slab分配器的高速缓存中得到的l也就是说每种对象类型对应一个高速缓存1/2/202346Linux OS Analysis每个高速缓存被分成多个每个高速缓存被分成多个slabs,每个slab由一个或多个连续的页框组成,其中包含一定数目的对象1/2/202347Linux OS Analysis每个slab有三种状态:全满,半满,全空全满意味着slab中的对象全部已被分配出去全空意味着slab中的对象全部是可用的半满介于两者之间当内核函数需要一个新的对象时,优先从半满的sl

20、ab满足这个请求否则从全空的slab中取一个对象满足请求如果没有空的slab则向buddy系统申请页面生成一个新的slab1/2/202348Linux OS Analysis高速缓存描述符和高速缓存描述符和slab描述符之间的关系描述符之间的关系1/2/202349Linux OS Analysis普通和专用高速缓存普通和专用高速缓存每个高速缓存使用kmem_cache表示普通高速缓存根据大小分配内存26个,2组(一组用于DMA分配,另一组用于常规分配)每组13个,大小从25=32个字节,到217=132017个字节数据结构cache_sizes数组:malloc_sizes专用高速缓存根据

21、类型分配1/2/202350Linux OS Analysis阅读文件阅读文件kmalloc_sizes.h1/2/202351Linux OS Analysis1/2/202352Linux OS Analysisslab分配器提供的接口分配器提供的接口创建专用高速缓存:kmem_cache_create撤销专用高速缓存:kmem_cache_destroy一般内核撤销一个模块时会调用这个函数撤销属于那个模块的cache类型从专用高速缓冲中分配和释放从高速缓存中分配/释放一个内存对象kmem_cache_alloc/kmem_cache_free从普通高速缓存中分配和释放kmalloc/kf

22、ree举例说明使用情况1/2/202353Linux OS Analysisslab分配器和伙伴系统的接口分配器和伙伴系统的接口slab分配器调用kmem_getpages()来获取一组连续的空闲页框相应的有kmem_freepages()来释放分配给slab分配器的页框1/2/202354Linux OS Analysis如果编写的内核模块有许多创建和释放数据结构的操作,可以考虑调用前面所述的slab分配器的接口创建一个高速缓存这样可以大大减少内存的访问时间1/2/202355Linux OS Analysis3、非连续存储区管理、非连续存储区管理把线性空间映射到一组连续的页框是很好的选择有

23、时候不得不将线性空间映射到一组不连续的页框优点:避免碎片1/2/202356Linux OS Analysis为非连续内存区保留的线性地址空间为非连续内存区保留的线性地址空间VMALLOC_STARTVMALLOC_END1/2/202357Linux OS Analysis非连续存储区的描述符vm_structVmalloc等分配一个非连续存储区Vfree释放非连续线性区间include/linux/vmalloc.hmm/vmalloc.c1/2/202358Linux OS Analysis页框管理、内存区管理、非连续存储区管理页框管理、内存区管理、非连续存储区管理之间的关系之间的关系物理内存:页框管理,以页框为单位进行管理使用slab算法,以若干个字节为单位进行管理分配出一些页框直接使用分配到的页框,例如进程描述符使用分配到缓冲区分配出一些页框非连续存储区,映射到非连续的物理页框上使用分配到线性区1/2/202359Linux OS Analysis作业作业Linux的页框管理采用什么算法?简述该算法。Linux中的slab算法的用途是什么?简述该算法。什么是非连续内存区?1/2/202360Linux OS Analysis

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

当前位置:首页 > 生活休闲 > 生活常识

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁