计算机操作系统课程小论文Linux内存管理机制姓名:汪青松班级:10网络工程1班学号:1004031010Linux内存管理机制班级:10级网络工程1班姓名:汪青松学号:1004031010一、概述现代操作系统允许多个程序同时运行,因此,内存中需要同时存放这些程序,操作系统采用的存储管理方案有分区存储管理、分页式存储管理、分段式存储管理和段页式存储管理。在Linux平台上,多任务运行是不可或缺的,在合理的进程调度算法控制下还得合理的管理内存机制,除了在物理内存的支持下,Linux还得借助虚拟内存等来容纳更多的程序运行,没有足够的内存空间来供程序运行,机器则会出现假死机、服务异常等问题,如果Linux虽然可以在一段时间内自行恢复,但是恢复后的系统已经基本不可用了。因此,合理规划和设计Linux内存的使用,是非常重要的。二、Linux下内存管理框架在Linux中对于内存的管理涉及到:页面管理、连续内存区管理和非连续存储区管理,而对于内存管理的方式通常为直接使用、使用slab分配器和使用非连续的存储区。其Linux采用页作为内存管理的基本单位,其采用的标准的页面大小为4KB,采用三次映射机制实现从线性地址到物理地址的映射。Linux内核使用页描述符来跟踪和管理物理内存,每个物理页面都用一个页描述符表示,页描述符用structpage的结构描述,所有物理页面的描述符组织在men_map数组中,page则是对物理页面描述的一个数据结构Linux采用buddy算法来解决内存的碎片问题。三、Linux对虚拟内存的管理在Linux中经常发现空闲内存很少,似乎所有的内存都被系统占用了,表面感觉是内存不够用了,其实不然。这是Linux内存管理的一个优秀特性,在这方面,区别于Windows的内存管理。主要特点是,无论物理内存有多大,Linux都将其充份利用,将一些程序调用过的硬盘数据读入内存,利用内存读写的高速特性来提高Linux系统的数据访问性能。而Windows是只在需要内存时,才为应用程序分配内存,并不能充分利用大容量的内存空间。换句话说,每增加一些物理内存,Linux都将能充分利用起来,发挥了硬件投资带来的好处,而Windows只将其做为摆设,即使增加8GB甚至更大。Linux的这一特性,主要是利用空闲的物理内存,划分出一部份空间,做为cache和buffers,以此提高数据访问性能。从而引出物理内存的特性。对于从物理内存中虚拟出来的内存可以解决内存容量的问题,还拥有许多的附加功能:诸如大地址空间;进程保护;内存映射;灵活分配物理内存;共享虚拟内存等。Linux对于虚拟内存的管理以进程为基础,如32位的线性进程映射到4Gb的虚拟空间中去,从0XC0000000到0XFFFFFFFF的1Gb空间为所用进程所共享的内核空间,每个进程都有自己的3Gb用户空间。四、Linux对物理内存的管理在Linux中对于物理内存的管理主要是通过页面的方式(一)、物理内存的页面管理在内存基本框架中已经提起,Linux对于物理内存的空间主要是通过分页的方式来进行管理的,其具体做法就是将物理内存划分成大小相同的物理页面。在X86平台下每个页面的大小为4KB,4KB是大多数磁盘块大小的倍数,传输效率高,管理方便。Linux设置了一个mem_map数组管理内存页面,它开始时由free_area_init()来初始化创建,并且放在物理内存的底部。(图一)mem_map数组结构(图二)Buddy算法(二)、空闲页面的管理(Buddy算法)Buddy的基本思想是:首先把内存中的所有页面按照2n划分其中n=0~5,对一个内存空间按1个页面、2个页面、4个页面、8个页面、16个页面、32个页面进行六次划分,划分后形成了大小不等的存储块称为页面块,简称页块。包含1个页面的页块称为1页块,包含2个页面的称为2页块,依此类推。Linux把物理内存划分成了1、2、4、8、16、32六种页块。对于每种页面块按前后顺序两两结合成一对Buddy伙伴按照1页面划分后,0和1页、2和3页……是1页块Buddy。按照2页面划分,0-1和2-3、4-5和6-7……是2页块。BuddyLinux把空闲的页面按照页块大小分组进行管理,用数组free_area[]来管理各个空闲页块组。在linux/mm/page_alloc.c中定义如下:#defineNR_MEN_LIST6Staticstructfree_area_structfree_men[NR_MEN_LIST];Structfree_area_struct{Structpage*next;Structpage*prev;Unsignedint*map;}五、内存空间的分配和释放(一)、物理内存分配Linux中在申请和释放较小的内存时,使用kmalloc()和kfree()在物理内存中进行分配。这些内存是实际存在的,并且是连续的,并且是根据slab块来分配。kmalloc()和kfree()分配和释放内存是以块(block)为单位进行的。可以分配的空闲块的大小记录在blocksize表中,它是一个静态数组,定义在/mm/kmalloc.c中:在使用kmalloc()分配空闲块时仍以Buddy算法为基础,即以free_area[]管理的空闲页面块做为分配对象。重新制定了分配的单位,blocksize[]数组中的块长度。它可以分配比1个页面更小的内存空间。blocksize[]中的前7个是在1个空闲页面内进行分配,其后的6种分别对应free_area[]的1至32空闲页面块,当申请分配的空间小于或等于1个页面时,从free_area[]管理的1页面块中查找空闲页面进行分配。若申请的空间大于一个页面时,按照blocksize[]后六个块单位进行申请,从free_area[]中与该块长度对应的空闲页块组中查找空闲页面块。Free_area数组定义如下:Typedefstructfree_area_struct{Structlist_headfree_list;Unsignedint*map;}free_area_t;(二)、虚拟内存分配在分配在物理申请较大的内存空间时,使用vmalloc()。由vmalloc()申请的内存空间在虚拟内存中是连续的,它们映射到在物理内存时,可以使用不连续的物理页面,而且仅把当前访问的部分放在物理页面中。Vmalloc申请内存如下:#defineA_MEGABYTE1024*1024intmain(){char*some_memery;intmegabyte=A_MEGABYTE;intexit_code=EXIT_FAILURE;some_memery=(char*)valloc(megabyte);/*申请内存*/if(some_memery!=NULL){sprintf(some_memery,Helloworld!\n);/*将字符串写入some_memery所指向内存*/printf(%s,some_memery);free(some_memery);/*释放内存*/printf(memeryisfree!\n);exit_code=EXIT_SUCCESS;}exit(exit_code);}六、缓存和刷新机制在Linux中除了引入虚拟内存的概念外,在前面也提及了高速缓存的概念。为了更好的呃发挥系统性能,Linux采用了一系列和内存相关的机制:(一)、缓存区高速缓存:包含了从设备中读取的数据块或写入设备的数据块。缓冲区高速缓存由设备标示号和块索引,因此可以快速找到数据块。如果数据可以在缓冲区中高速缓存中找到,则不需要从物理块设备上读取,从而加快了访问速度。(二)、页高速缓存:这一高速缓存用来加速对磁盘上的映像和数据访问,它用来缓存某个文件的逻辑内容,并通过文件VFS索引节点和偏移量访问。当页从磁盘读到物理内存时,就缓存在页高速缓存。(三)、交换高速缓存:用于多个近程共享的页面被换出到交换区的情况。当页面交换到交换文件之后,如果有进程再次访问,它会被重新调入内存。Linux需要从物理内存中交换出某个页面时,它首先分析交换缓存中的信息,如果缓存中包含该物理页面的一个非零页面表项,则说明该页面交换出内存后还没有被修改过,这时,系统只需丢弃该页面。概括下就是我们提到的cached、buffers和swap,buffers与cached都是内存操作,用来保存系统曾经打开过的文件以及文件属性信息,这样当操作系统需要读取某些文件时,会首先在buffers与cached内存区查找,如果找到,直接读出传送给应用程序,如果没有找到需要数据,才从磁盘读取,这就是操作系统的缓存机制,通过缓存,大大提高了操作系统的性能。但buffers与cached缓冲的内容却是不同的。buffers是用来缓冲块设备做的,它只记录文件系统的元数据,而cached是用来给文件做缓冲。更通俗一点说:buffers主要用来存放目录里面有什么内容,文件的属性以及权限等等。而cached直接用来记忆我们打开过的文件和程序。这里给出有关交换缓存的部分函数及功能:位于/linux/mm/swap_state.c中。七、总结Linux作为一款免费、开源高效的操作系统,是近年来使用比较多的一款操作系统,也应用于各个行业,在全世界范围内也有一大批爱好者。由于简单、巧妙和高效是Linux内核的原则,从而在Linux的发展过程中需要不断完善和优化内存的管理单元的功能和性能。针对某些特殊和具体的领域和行业,还可以根据自己的需求定制Linux内核。而内存管理单元作为Linux操作系统的核心部分,更是起着举足轻重的作用。八、参考文献:[1]宋锦华,马传琦.Linux内存管理-Buddy算法探究[J].福建电脑,2009,(01)[2]赵鲲鹏,苏葆光《现代计算机:下半月版》2006第5期[3]邱铁《Linux应用与开发典型实例精讲》,清华大学出版社[4]周苏,金海溶《操作系统原理实验》,科学出版社[5]ChinaUnix:[6]百度空间:[7]ChinaUnix:[8]Cnblog: