《可变分区存储管理的内存分配与回收》由会员分享,可在线阅读,更多相关《可变分区存储管理的内存分配与回收(29页珍藏版)》请在金锄头文库上搜索。
1、操作系统课程设计课程名称操作系统题目名称可变分区存储管理的内存分配与回收专业班级10计算机科学与技术(2)班学生姓名张永鹏周田学 号 36 45 56 54 57评级:A:周田B:赵天择 俞临曲魏华明张永鹏一、摘要31.1课程设计的目的31.2实验要求31.3预备知识31.4任务分配3二、设计思路4三、主要数据结构53.1全局变量53.2空闲分区表的定义53.3已分配分区表的定义53.4动态输入构造空闲区表53.5分配内存63.6对空闲区排序73.7回收内存7四、部分程序流程图94.1申请内存空间94.2回收内存9五、程序运行截图125.1首次适应算法125.1.1动态输入构造空闲区表125.
2、1.2分配内存125.1.3回收内存135.2最佳适应算法145.2.1动态输入构造空闲区表145.2.2分配内存145.2.3回收内存16六、源程序176.1首次适应算法176.2最佳适应算法22七、心得体会28一、摘要1.1课程设计的目的深入了解采用可变分区存储管理方式的内存分配回收的实现。1.2实验要求(1) 内存分配采用首次适应算法与最佳适应算法分别完成。(2) 动态输入构造空闲区表,并显示构造好的空闲区表。(提示:在两种不同的内存分配算法中,空闲区在空闲区表中的登记顺序是不一样的)(3) 键盘接收内存申请尺寸大小。(4) 根据申请,实施内存分配,并返回分配所得内存首址。分配完后,调整
3、空闲区表(即扣除分配部分),并显示调整后的空闲区表。(6)若分配失败,返回分配失败信息。内存回收根据空闲区表,按内存回收的四种情况从键盘接收回收区域的内存首址与大小;回收区域,调整空闲区表(与前面空闲区相连,与后面空闲区相连,与前后空闲区相连则合并,与前后空闲区都不相连则插入该项),并显示调整后的空闲区表。1.3预备知识需掌握扎实的c语言编程能力及可变分区存储管理方式的内在分配与回收的基本知 识。1.4任务分配周田:主程序的实现。赵天择:修改程序及整合课程设计报告。魏华明、俞临曲:画流程图。张永鹏:调试程序及课程设计的分析总结。:、设计思路对于可变分区存储管理的内存分配与回收,主要为设计以下几
4、个部分:1、设计动态输入空闲分区表的程序2、设计内存分配的程序3、设计内存回收的程序对于其他的,比如显示构造好的空闲区表显示调整后的空闲区表、显示作业分配情况等等 都比较容易些。为了便于对内存的分配和回收,建立两张表记录内存的使用情况。一张为记录作业占 用分区的“内存分配表”,内容应包括分区起始地址、长度、作业名;一张为记录空闲 区的“空闲分区表”,内容包括分区起始地址、长度、标志0表空栏目,1表未分配)。 两张表都采用顺序表形式。根据题目要求,内存分配的算法需设计两种:首次适应算法和最佳适应算法。对于首次适应算法,要求空闲分区链以地址递增的次序链接。在分配内存时,从链首开始顺序查找, 直至找
5、到一个大小能满足要求的空闲分区为止;然后再按照作业的大小,从该分区中划出一块内存 空间分配给请求者,余下的空闲分区仍留在空闲链中。若从链首直至链尾都不能找到一个能满足要 求的分区,则此次内存分配失败,返回。对于最佳适应算法,要求将所有的空闲分区按其容量已从 小到大的顺序形成一空闲分区链。这样,第一次找到的能满足要求的空闲区,必然是最佳的。根据两种算法的定义可知,若要设计最佳适应算法,只需在首次适应算法的基础 上,把空闲区表按长度大小从小到大排序即可。所以只需在首次适应算法的基础上插 入一个排序的程序(注:在内存分配的过程中,可能会产生存储空间“较小”的空间 分区,这样的小分区很小,很难再分配给
6、一个新的进程。因此,对于这样的分区,应 划分给最后一个申请分区的作业。)。接着就是设计内存回收的问题。当进程运行完毕释放内存时,系统根据回收区的首址,从空闲区链(表)中找到相应的插入 点,此时可能出现以下四种情况之一:(1)回收区与插入点的前一个空闲分区相邻接。此时应将回收区与插入点的前一个分区合并 形成新的空闲分区。用前一空闲分区的首址作为新空闲区的首址,长度为两者之和。(2)回收分区与插入点的后一空闲分区相邻接。此时将两分区合并,形成新的空闲分区。用 回收区的首址作为新空闲区的首址,长度为两者之和。(3)回收区同时与插入点的前、后两个分区邻接。此时将三个分区合并,使用前一空闲区的 首址作为
7、新空闲区首址,长度为三者之和。(4)回收区既不与上邻空闲区又没有下邻空闲区。这时只须将此区回收,回收区的首址为 新空闲区的首址,长度为回收区的长度。根据这四种情况编写回收内存的程序。三、主要数据结构3.1全局变量#define m 9 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/#define n 15 /*假定系统允许的最大作业为n,假定模拟实验中n值为10*/#define minisize 10/*假定系统允许的最小空闲分区表的长度*/3.2空闲分区表的定义structfloat address; /*空闲区起始地址*/float length; /*空闲区长度,单位
8、为字节*/int flag; /*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/free_tablem; /* 空闲区表*/3.3已分配分区表的定义structfloat address; /*B分分区起始地址*/float length; /*已分分区长度,单位为字节*/int flag; /*已分配区表登记栏标志,用0表示空栏目*/used_tablen; /* 已分配区表 */3.4动态输入构造空闲区表printf(请输入空闲分区块数:);/*空闲分区块数*/scanf(%d,&shu);printf(n请输入空闲分区信息:n起始地址 分区长度n);for(i=0;ishu;i+
9、)scanf(%d%d,&address,&length);free_tablei.address=address;free_tablei.length=length;free_tablei.flag=1;3.5分配内存void allocate(char str,float leg)int k,i;float ressize;uflag=0;fflag=0;for(i=0;i=leg)fflag=1;break;if(fflag=0) printf(没有满足条件的空闲区! ! ! n);elseressize=free_tablei.length-leg;for(k=0;kn;k+)if(u
10、sed_tablek.flag=0)if(ressizeminisize)/*剩余块过小 */used_tablek.length=free_tablei.length;used_tablek.address=free_tablei.address;used_tablek.flag=str;free_tablei.length=0;free_tablei.flag=0;break;elseused_tablek.address=free_tablei.address+ressize;used_tablek.flag=str;used_tablek.length=leg;free_tablei.
11、length=ressize;break;/*for 结束 */3.6对空闲区排序(按长度从小到大)for(i=0;ishu;i+)bi0=free_tablei.address;bi1=free_tablei.length;bi2=free_tablei.flag;for(i=0;ishu-1;i+)for(j=0;jbj+11)t=bj0;bj0=bj+10;bj+10=t;t=bj1;bj1=bj+11;bj+11=t;t=bj 2;bj=bj+12;bj+12=t;for(i=0;ishu;i+)free_tablei.address=bi0;free_tablei.length=bi
12、1;free_tablei.flag=bi2;3.7回收内存for(i=0;im;i+)uend_address=used_tablek.address+used_tablek.length;fend_address=free_tablei.address+free_tablei.length;if(used_tablek.address=fend_address&free_tablei+1.address=uend_address)/* 上 下都邻*/fflag=1;free_tablei.length=free_tablei.length+used_tablek.length+free_t
13、ablei+1.length;free_tablei.flag=1;used_tablek.flag=0;used_tablek.length=0;used_tablek.address=0;free_tablei+1.flag=0;free_tablei+1.length=0;free_tablei+1.address=0;printf(n 已回收!n);break;elseif(used_tablek.address=fend_address)/* 上 邻*/fflag=1;free_tablei.length=free_tablei.length+used_tablek.length;free_tablei.flag=1;used_tablek.flag=0;used_tablek.length=0;used_tablek.address=0;printf(n 已回收!n);break;elseif(free_tablei.address=uend_address)/* 下邻*/fflag=1;free_tablei.address=used_tablek.address;free_tablei.length=free_tablei.length+used_tablek.length;free_tablei