《03_Linux内存管理_2010091607.ppt》由会员分享,可在线阅读,更多相关《03_Linux内存管理_2010091607.ppt(42页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、第三章第三章 Linux内存管理内存管理43.1 内存管理概述43.2 内存管理原理43.3 Linux内存管理实现1存储系统结构存储系统结构4MMUMemory management Unit4Virtual MemorySvm=SRAM+Sswap2概述概述4内存管理allocate deallocate keeping track4合理地管理系统的内存资源,使多个进程能够在有限的物理存储空间内共享,安全并高效地运行。4Linux内存管理四大功能内存分配与回收地址变换内存保护内存扩充3内存分配与回收内存分配与回收4内存分配为进入系统准备运行的程序分配内存空间4内存回收当程序运行结束后回收其
2、所占用的内存空间4存储分配与回收的主要要素描述存储分配的数据结构表格、链表或队列等占用区、空闲区分配策略利用率、系统性能4地址变换地址变换4符号地址 逻辑地址 物理地址4地址变换静态地址变换动态地址变换5内存保护内存保护4防止程序越界和越权行为不允许用户进程访问操作系统的存储区域每个进程都在自己的地址空间中运行,互不干扰4内存保护的措施界限保护设置界限寄存器,限制进程的活动空间。保护键为共享内存区设置一个读/写保护键,在CPU中设置保护键开关,它表示进程的读/写权限。只有进程的开关代码和内存区的保护键匹配时方可进行访问。保护模式将CPU的工作模式分为用户态与核心态。核心态下的进程可以访问整个内
3、存地址空间,而用户态下的进程只能访问在界限寄存器所规定范围内的空间。6内存扩充内存扩充4借用外存空间来扩展内存空间,方法是让程序的部分代码进入内存,其余驻留在外存,在需要时再调入内存。4内存扩充实现方法:虚拟存储(virtual memory)程序的部分代码的换入和换出完全由系统动态地完成,用户察觉不到。用户看到的是一个比实际内存大得多的“虚拟内存”。方便用户编程,存储扩充的性能好7第三章第三章 Linux内存管理内存管理43.1 内存管理概述43.2 内存管理原理43.3 Linux内存管理实现8存储管理方案存储管理方案4单一连续存储管理4分区存储管理4页式存储管理4段式存储管理4段页式存储
4、管理9单一连续存储管理单一连续存储管理4在内存中只存放一个应用程序,这个应用程序和操作系统共享存储器单用户、单任务的操作系统 DOS静态地址变换采用界限保护不允许用户程序访问操作系统区域覆盖技术10分区存储管理分区存储管理4多道程序系统4内存划分为若干个分区,操作系统占用其中一个分区,其他分区由用户程序使用,每个分区容纳一个用户程序。4分区方法固定分区 内部碎片可变分区外部碎片11页式页式 存储管理存储管理(1)(分散存储分散存储)4页面(page)将程序的逻辑地址空间分成若干大小相等的片段4页帧(page frame)把内存空间也按同样大小分为若干区域4程序的逻辑地址页号+页内位移12页式页
5、式 存储管理存储管理 (2)(分散存储分散存储)4页表记录了进程的页面与块号的对应关系13页式页式 存储管理存储管理 (3)(分散存储分散存储)4页式 地址变换14段式段式 存储管理存储管理 (1)4应用程序一个主模块、若干个子模块、数据模块等划分模块的好处可以分别编写和编译源程序可以实现代码共享、动态链接等编程技术。4段式存储分配为了适应用户对程序结构的需求而设计的存储管理方案4程序的地址空间由若干个大小不等的段组成。段(segment)是逻辑上完整的信息单位,划分段的依据是信息的逻辑完整性以及共享和保护等需要。分段后,程序的逻辑地址由段号和段内位移两部分组成。15段式段式 存储管理存储管理
6、 (2)4分页 与 分段 的区别段是信息的逻辑单位,长度不固定,由用户进行划分;页是信息的物理单位,长度固定,由系统进行划分,用户不可见。4段式分配以段为单位分配内存,每个段分配一个连续的分区段与段间可以不相邻接用段表描述进程的各段在内存中的存储位置段表中包括段长和段起始地址等信息16段式段式 存储管理存储管理 (3)4段式分配17段式段式 存储管理存储管理 (4)4段式 地址变换18段段 页页 式式 存储管理存储管理4分配思想:段式划分,页式存储把程序的各段按页式分配方式存储每段一个页表另设一个段表,指示各段的页表位置4程序的逻辑地址段号+页号+页内地址4地址变换过程是:先根据段号查段表再用
7、页号查页表最后与页内地址合并即可得到实际内存地址4优点:存储利用率高,满足各种应用需求。4缺点:过于复杂,软硬件开销大。19第三章第三章 Linux内存管理内存管理43.1 内存管理概述43.2 内存管理原理43.3 Linux内存管理实现PageMemory zonePage frame空闲内存的管理内存的分配和回收Slab 20Page (1)4page descriptorinclude/linux/mm.hstruct page.21Page (2)unsigned long flag include/linux/page-flags.henum pageflags ;22Page (
8、3)atomic_t count;0表示页可用,n表示n个进程可访问页中数据struct list_head list;next 和 prev 构成双向链表 struct address_space*mapping;指向address_spacestruct list_head lru;通过next 和 prev 指向LRU(Least Recently Used)List中的页面void*virtual;指向页所对应的virtual address23Memory Zone (1)4composed of page frames(physical pages)include/linux/mm
9、zone.hZONE_DMA used for DMA page framesZONE_NORMAL non-DMA pages with virtual mappingZONE_HIGHMEMpages whose addresses are not contained in the virtual address spacestruct zone/*Fields commonly accessed by the page allocator*/24Memory Zone (2)spinlock_t lock;spinlock;lock for the descriptor itself u
10、nsigned long free_pages;the number of free pages that are left in the zonenr_free_pages()unsigned long pages_min,pages_low,pages_high;spinlock_t lru_lock;struct list_head active_list;list of the active pages struct list_head inactive_list;a list of pages that can be reclaimed int all_unreclaimable;/
11、if 1,*All pages pinned*/struct free_area free_areaMAX_ORDER;25Memory Zone (3)for_each_zone()#define for_each_zone(zone)for(zone=pgdat_list-node_zones;zone;zone=next_zone(zone)is_highmem()static inline int is_highmem(struct zone*zone)return(zone-zone-zone_pgdat-node_zones=ZONE_HIGHMEM);is_normal()sta
12、tic inline int is_normal(struct zone*zone)return(zone-zone-zone_pgdat-node_zones=ZONE_NORMAL);26Page Frame(1)4A page frame is the unit of memory that holds a page.4分配 Page Frames函数 (2n)alloc_pages()和 alloc_page()(include/linux/gfp.h)#define alloc_pages(gfp_mask,order)alloc_pages_node(numa_node_id(),
13、gfp_mask,order)#define alloc_page(gfp_mask)alloc_pages(gfp_mask,0)static inline struct page*alloc_pages_node (int nid,gfp_t gfp_mask,unsigned int order)27Page Frame(2)_get_free_page()和 _get_dma_pages()#define _get_free_page(gfp_mask)_get_free_pages(gfp_mask),0)#define _get_dma_pages(gfp_mask,order)_
14、get_free_pages(gfp_mask)|GFP_DMA,(order)the pages requested be from ZONE_DMA by adding that flag onto the page flag mask.28Page Frame(3)4释放 Page Frames 函数_free_page()和 free_page()#define _free_page(page)_ _free_pages(page),0)#define free_page(addr)free_pages(addr),0)29空闲内存的管理空闲内存的管理(1)4记录空闲内存位示图+链表页
15、块组(page block)连续的页帧4free_area数组数组第k项对应的链表记录系统中所有2k大小的空闲页块组的起始页帧号4空闲链表双向链表30空闲内存的管理空闲内存的管理(2)4伙伴(buddy)将内存按相同大小的页块组划分并编号,则以偶数号开始的相邻的两个页块组称为伙伴例如:如页块组大小为2帧,则0号页块组(01帧)与1号页块组(23帧)是伙伴,2号页块组(45帧)与3号页块组(67帧)是伙伴,但1号页块组与2号页块组不是伙伴。4位示图(bitmap)由若干个字节的二进制位构成,每位对应一对伙伴。数组第k项对应的位示图记录2k大小的一对伙伴的分配使用情况,为1表示对应的伙伴中有一个是
16、空闲的页块,为0表示对应的两个伙伴页块都空闲或都不空闲。31内存的分配与回收内存的分配与回收 (1)4Buddy systemTo reduce external fragmentation,buddy system maintains a list of available blocks of memory.Linux采用伙伴(buddy)算法来分配和回收内存,内存的分配和回收的空间大小都是2k大小的页块组。4内存分配对于i386系统,内存一次分配的最小尺寸是4KB(204KB),最大为2MB(294KB)。分配页函数struct page*fastcall _ _alloc_pages(u
17、nsigned int gfp_mask,unsigned int order,struct zonelist*zonelist)32内存的分配与回收内存的分配与回收 (2)当要分配内存时,先根据需要确定要分配的页块组大小。如需要n页,2k1n2k,则分配一个2k大小的页块组。分配时,在free_areak的链表中找一个空闲页块组,将其从链表中删除,返回首地址。若没有2k大小的页块组,就在free_areak+1的链表中取下一个,一分为二,分配一个,将另一个链入free_areak的链表中。如果没有2k+1大小的页块组就进一步地分裂更大的页块组。33内存的分配与回收内存的分配与回收 (2)4内
18、存回收释放页函数static inline void _ _free_pages_bulk(struct page*page,struct page*base,struct zone*zone,struct free_area*area,unsigned long mask,unsigned int order)回收内存时,将释放的页块组链入适当的链表中。如果该页块组的伙伴为空闲(位示图的对应位为1),则将其与伙伴合并,加入到下一个数组项的链表中。如果还能合并就进一步合并下去。每次分配或回收操作后都要修改free_area数组的相应的链表和位示图。Merge 归并、合并34内存的分配与回收内存
19、的分配与回收 (3)4Buddy system评价优点buddy算法可以尽量减少内存碎片,增加连续内存分配成功的几率,使总体效率显著提高。缺点这个算法可能造成空间的浪费,因为它每次分配的内存是2的整数幂个页,如果需要的内存量是33KB,则实际分配的是16个连续的页帧(64KB),将近50%的内存就浪费掉了。总结:算法的高效率是通过牺牲内存资源利用率换来的。35Slab Allocator (1)4the slab allocator is made up of many caches,each of which stores memory areas of different sizes.A
20、cache is further subdivided into containers called slabs.Each slab is made up of one or more contiguous page frames.36Slab Allocator (2)specialized cachetask_struct,inode,dentryGeneral cache32,64,128,256,512,1024,2048,4096,8192,16384,32768,65536,131072 bytecat/proc/slabinfo37Slab Allocator (3)Cache
21、Descriptor38Slab Allocator (4)4Cache Descriptor (kmem_cache)39第三章第三章 Linux内存管理内存管理43.1 内存管理概述43.2 内存管理原理43.3 Linux内存管理实现43.4 虚拟存储管理40虚拟存储虚拟存储(1)4程序局部性原理在进程运行的每个较短的时间段中,进程的地址空间中只有部分空间是活动的(即被CPU访问的),其余的空间则处于不活动的状态。4虚拟存储器原理以时间换取空间用外存模拟内存,实现内存空间的扩充在外存开辟一个存储空间,称为交换区。进程启动时,只有部分程序代码进入内存,其余驻留在外存交换区中,在需要时调入内存。内存与交换空间之间的交换完全由系统动态地完成,应用程序并不会察觉,因而应用程序看到的是一个比实际内存大得多的“虚拟内存”。进程的逻辑地址空间可以超越实际内存容量的限制。41虚拟存储虚拟存储(2)4页式虚拟存储器原理42