您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 操作系统实验之内存管理实验报告
武汉理工大学学生实验报告书实验课程名称计算机操作系统开课学院计算机科学与技术学院指导老师姓名学生姓名学生专业班级2016—2017学年第一学期学生学号实验课成绩实验三内存管理一、设计目的、功能与要求1、实验目的掌握内存管理的相关内容,对内存的分配和回收有深入的理解。2、实现功能模拟实现内存管理机制3、具体要求任选一种计算机高级语言编程实现选择一种内存管理方案:动态分区式、请求页式、段式、段页式等能够输入给定的内存大小,进程的个数,每个进程所需内存空间的大小等能够选择分配、回收操作内购显示进程在内存的储存地址、大小等显示每次完成内存分配或回收后内存空间的使用情况二、问题描述所谓分区,是把内存分为一些大小相等或不等的分区,除操作系统占用一个分区外,其余分区用来存放进程的程序和数据。本次实验中才用动态分区法,也就是在作业的处理过程中划分内存的区域,根据需要确定大小。动态分区的分配算法:首先从可用表/自由链中找到一个足以容纳该作业的可用空白区,如果这个空白区比需求大,则将它分为两个部分,一部分成为已分配区,剩下部分仍为空白区。最后修改可用表或自由链,并回送一个所分配区的序号或该分区的起始地址。最先适应法:按分区的起始地址的递增次序,从头查找,找到符合要求的第一个分区。最佳适应法:按照分区大小的递增次序,查找,找到符合要求的第一个分区。最坏适应法:按分区大小的递减次序,从头查找,找到符合要求的第一个分区。三、数据结构及功能设计1、数据结构定义空闲分区结构体,用来保存内存中空闲分区的情况。其中size属性表示空闲分区的大小,start_addr表示空闲分区首地址,next指针指向下一个空闲分区。//空闲分区typedefstructFree_Block{intsize;intstart_addr;structFree_Block*next;}Free_Block;Free_Block*free_block;定义已分配的内存空间的结构体,用来保存已经被进程占用了内存空间的情况。其中pid作为该被分配分区的编号,用于在释放该内存空间时便于查找。size表示分区的大小,start_addr表示分区的起始地址,process_name存放进程名称,next指针指向下一个分区。//已分配分区的结构体typedefstructAllocate_Block{intpid;intsize;intstart_addr;charprocess_name[PROCESS_NAME_LEN];structAllocate_Block*next;}Allocate_Block;2、模块说明2.1初始化模块对内存空间进行初始化,初始情况内存空间为空,但是要设置内存的最大容量,该内存空间的首地址,以便之后新建进程的过程中使用。当空闲分区初始化失败时,要进行相应的提示。2.2菜单显示模块菜单包括,设置内存大小,选择分配算法,新建进程,终止进程,显示当前内存使用情况,退出六个选项。各个选项完成其名对应的功能,在程序中通过相应的函数实现对应的功能。2.3新建进程模块该模块完成在内存空间中申请一块空间供进程使用的功能,通过输入进程大小系统先查看内存空间中是否有足够的空间供其进行申请,若无,显示分配失败相应信息,否则在空闲内存分区块中选择最先的一块进行分配,若内存空间不足则继续向下查找,空闲内存分区的顺序通过三种算法给出。分配内存时,要指定进程的首地址和大小,并对内存空闲分区的大小做相应的修改。 2.4进程终止模块 通过输入对应pid完成对相应进程的终止功能,将其内存空间设置为空闲分区,若与已有空闲分区的地址连续则进行空闲分区的合并。 2.5最先适应法对空闲分区按照首地址的大小从小到大进行排序。2.6最佳适应法对空闲分区按照内存块的大小从小到大排序。2.7最坏适应法对空闲分区按照内存块的大小从大到小排序。四、开发工具及主要源代码1、开发工具sublimeText3文本编辑器,采用g++编译。2、主要源码这里只给出最先适应算法的源码,由于三种算法均为对链表进行排序,只是排序依据的属性不同,结构上几乎相似,在此就不做赘述/*最先适应算法,按地址的大小由小到达排序*/voidrFirst_Fit(){Free_Block*temp,*p=NULL;Free_Block*head=NULL;intcurrent_min_addr;if(free_block){temp=free_block;current_min_addr=free_block-start_addr;while(temp-next!=NULL){if(temp-next-start_addrcurrent_min_addr){current_min_addr=temp-next-start_addr;p=temp;}temp=temp-next;}if(p!=NULL){temp=p-next;p-next=p-next-next;temp-next=free_block;free_block=temp;}head=free_block;p=head;temp=head-next;while(head-next!=NULL){current_min_addr=head-next-start_addr;while(temp-next!=NULL){if(temp-next-start_addrcurrent_min_addr){current_min_addr=temp-next-start_addr;p=temp;}temp=temp-next;}if(p-next!=head-next){temp=p-next;p-next=p-next-next;temp-next=head-next;head-next=temp;}head=head-next;temp=head-next;p=head;}}return;}//创建一个新的进程intNew_Job(){structAllocate_Block*ab;intsize;intret;ab=(structAllocate_Block*)malloc(sizeof(structAllocate_Block));if(!ab)exit(-5);ab-next=NULL;pid++;sprintf(ab-process_name,进程-%02d,pid);ab-pid=pid;printf(Memfor%s:,ab-process_name);printf(进程大小:);scanf(%d,&size);if(size0){ab-size=size;}ret=Alloc_Mem(ab);if((ret==1)&&(Allocate_Block_head==NULL)){Allocate_Block_head=ab;return1;}elseif(ret==1){ab-next=Allocate_Block_head;Allocate_Block_head=ab;return2;}elseif(ret==-1){printf(分配失败\n);pid--;free(ab);return-1;}return3;}//选择杀死一个进程voidKill(){structAllocate_Block*ab;intpid;printf(终结进程,pid=);scanf(%d,&pid);ab=find_process(pid);if(ab!=NULL){Free_Mem(ab);dispose(ab);}}五、测试用例及运行结果、分析程序最初要对内存空间进行分配,设置内存空间的大小。初始设置内存总大小为100个单位,若不手动设置,则默认为256个单位。此为最初插入7个进程后的内存状态,此时内存空间无空余块可用。通过进程终止操作将pid为1、3、5、7四个进程终止,则其原占用的内存空间释放,变为空闲的内存空间。采用最先适应法新建一个大小为16的进程,结果如上图所示。采用最佳适应法插入一个大小为7的进程后内存的情况。分析:此处对于内存管理的模拟实现完成的较为成功,可以采用最先适应法和最佳适应法两种算法进行进程的新建,能够正确计算对应的首地址,与内存空间。同时对于空闲内存空间也可以做出正确的合并操作。最初内存空间为空,可以通过新建进程和终止进程两种操作来完成不连续内存空闲空间的建立。三种算法的比较:最先适应法:尽可能的利用了低地址空间,从而保证高地址有较大的空闲区来防止要求内存较多的进程或作业该算法的分配和释放的时间性能较好最佳适应法:利用最接近于所要求的内存大小。若存储空间中有正好等于所要求大小的空白区,则必然被选中。由于空白区一般不可能正好和要求的相等,这往往使剩下的空白区都比较小,形成碎片。寻找一个较大的空白区时,要花费较多的时间;回收一个分区时,为了把它插入到空白区链中合适的位置上开销较大。最坏适应法:避免了空闲区越分越小留下碎片的问题,即每次分配时总是将最大的空闲区切去一部分分配给请求者(使分配后的剩余部分可能仍是一个较大的空闲区,仍能进行再分配)。六、自我评价与总结在本次实验中,通过运用c++高级程序设计语言,与操作系统的理论结合起来,验证了动态分区式内存管理中的最先适应法和最优适应法的整体过程,和其对于内存管理的优缺点。采用链表的形式进行操作也使得过程较为方便,便于在分配和回收内存空间之后将空闲区链接起来。另外程序在终端和人的交互良好,通过菜单显示相应操作提示人进行操作。不足之处在于,本次实验中没有实现最坏适应法,分析可能是在在排序的过程中链表的指针出现了错误,在开始调试阶段只对单一算法进行了调试从而忽略了这个问题的存在,直到编写本报告的时候才发现这个问题。这种问题实属不该,可以通过完善的测试避免,以后要避免这种问题。本次实验通过对于内存管理的动态分区式算法实现,对这内存管理的理解更加深刻了,也通过实验结果的比较,掌握了动态分区式内存管理中三种算法在不同进程情况下的优劣情况。通过这样一个一个小实验,也一定程度上锻炼了我的编程能力。
本文标题:操作系统实验之内存管理实验报告
链接地址:https://www.777doc.com/doc-5537882 .html