资源描述:
《[精品]内存管理1.doc》由会员上传分享,免费在线阅读,更多相关内容在工程资料-天天文库。
1、内存管理第一部分:地址划分cpu地址:按cup地址总线的寻址范围:4g,这个地址是虚拟的。0到3g用户虚拟地址,3g到4g内核虚拟地址物理地址:物理内存地址,物理内存用于存放用户进稈空间可执行代码或者内核关键数据结构,这些代码由cpu通过MMU寻址或考cache命屮。Linux2.6支持非一致内存访问NUMA原理:物理内存被划分为多个节点,每个节点被划分为三个管理区:ZONE.DMAZONE_NORMALZONE_HIGHMEM.在一个单独节点内,同一个cpu的访问时问是相同的。(这个的作用不明白)onelistCPU0CPU1CPU2Zone_normal,和zone_dma包含常规页框。
2、线性地映射到地址空间的第四个Gb,内核就可以直接访问。Zonejiigh不能由内核肓接访问。虚拟地址:4G,前面的3gb虚拟内存为用户地址空间:包括,数据段,代码段,BSS,堆,共享内存区域,栈等。现在讲后一血最后1Gb与物理地址的映射关系。也就是内核空间与物理内存的映射。1G物理空间肓接映射部分地址就是我们说的逻辑地址,该部分地址由虚拟地址减去一个偏移就活得物理地址。它占896MB.这部分也就是前面说的内核可以直接访问的那两个区域,内核可以在这部分内存屮给用户分配内存等操作。后面128为高端内存,高端内存的使用后面再讲。虚拟地址空间划分:Oxbfffffff>stack栈进程2mmstru
3、ct*vmmmap区mmapcode段进程1mmstruct'stack栈gapvmareastructvmareagapvmareavmarea0x0/mmap区*mmap这表示由两个进程的虚拟地址空间。由虚拟地址到物理地址的转换是难点。主要是通过贞表关于地址部分基木已经清楚。第二部分:内存请求两种需求:一是用户空问发出内存请求(malloc),而是由内核需要(比如需要特定数据结构,如进程描述符,文件描述符等等)这些内存需求都是需要内核去做内存分配的操作。这种请求可能会因为没有连续内存等原因会阻塞,但有些请求是不允许阻塞的,如执行在屮断处理程序屮,或者临界区代码时,需要使用GFP.ATOM
4、IC标志。为了保证尽量不失败:做一个保留内存池:这是在前两个管理区(dma,non™l)屮将一定数量的页框保留给内存。两种请求返冋内存单位:一种是以页框为单位返回,一种是小于页的地址。第一•种主要是争对连续页框组的分配请求。适合于大块内存分配,这会引起外碎片。lloc_pages(gfp_mask,order),alloc_page(gfp_mask).free_pages,free_page.常用的标志是GFP_ATOMIC,GFP_DMA,GFP_KERNEL,GFP_USER.....第二种主要是争对小块内存分配,在一个页内分配一定空间会引起内碎片。3种减少碎片的方案:对于外碎片使川的
5、是伙伴算法,管理区分配器会接受动态内存的请求和释放,请求时会请求一组连续页框的管理区(dnu,normal,high),在这管理区屮分配页框会用到伙伴算法。外碎片导致的原因:频繁请求帑放不同大小的一组连续页框,这会导致在管理区屮剩下一些小块的空闲页框。伙伴算法思想:把空闲页框分组成11个块链表。分别以节点大小1,2,4,8....1024.当请求一个128M的块就向128链表去取如果为空就到256中取,剩下的128插入128链表屮去。对于内碎片使用的是slab分配器。内碎片导致的原因,主要是页内获取小块内存导致页内碎片,如频繁申请释放一些内核数据结构,进程描述符等,导致内碎片。Slab分配器
6、的思想:把屮请的内存当作对象:这种对象主要有进程描述符,打开的文件。比如进程的创建和撤销,文件的打开关闭会很频繁。频繁屮请内存会导致很多碎片。主要思想是“存储池”的引用。申请的对象使用完并不释放,而是再次放入存储池,下次需要用的时候直接从存储池取。它除了申请对彖外。还可以用于小块内存的申请,为Kmalloc准备的,Kmalloc就是使用的slab分配器提供的接口,它是Get_free_pages的补充。分配粒度更灵活。Slab分配器还有一个优点:里面的对彖是已经初始化后的,当内核需要一个对象时,K接拿来用,减少初始化,提高了效率。内核非连续内存的分配:伙伴算法只是减少了外碎片但是没有消除外碎
7、片。当申请一块连续虚拟地址空间,但是在物理内存没法满足这么大的地址空间的时候,通过把多块不连续的物理内存与虚拟地址空间映射,(这些小块不连续的内存相当于外碎片)这样就可以消除了外碎片。内核采用vmalloc分配连续虚拟内存。Vmlloc比kmalloc分配大得多的空间,它还需要重新映射页表,因此分配效率较低。对于大块内存分配会用到vmalloc.用户空间——APPmalloc%forksexcute>mmap