存储管理实验报告(操作系统)
- 格式:doc
- 大小:82.50 KB
- 文档页数:7
实验报告课程名称:操作系统实验项目名称:存储管理实验时间: 20120504 班级:姓名:学号:实验目的:理解可变分区管理方式下采用最佳适应分配算法实现主存分配和回收。
对理论课中学习的内存管理中的概念作进一步的理解。
实验环境:winTC实验内容及过程:1、分配主存采用最佳适应分配算法(Best fit),将空闲区表中的空闲区按其容量递增的次序排列。
当一个作业要求装入主存时,按由小到大的顺序查找空闲区说明表,找到第一个满足申请长度的空闲区(满足条件的最小空闲区)。
有时候空闲区大于作业需要量,需要将空闲区分成两部分,一部分作业占用,另一部分作为一个空闲区将其插入适当的位置。
为了方便查找,总是让“空表目”集中在表格的后面。
2、回收主存当一个作业执行结束撤离时,作业所占的区域应该归还,系统根据回收区的首址从空闲区表中找到相应的插入点,归还的区域如果与其他空闲区相邻(有如下三种情况),则应合成一个大的空闲区,病登记在空闲区说明表中。
否则作为一个新的空闲区登记在空闲区说明表中。
实验过程:1. 编写程序,由必要的数据结构、主函数、内存分配函数及主存回收函数构成。
实现可变分区管理方式下采用最优/佳适应分配算法实现主存的分配和回收。
2. 在上机环境中输入程序,调试,编译。
3. 设计输入数据,写出程序的执行结果。
实验结果及分析:程序a请求长度为10内存:作业b请求长度为20的内存:回收作业a主存回收b 的主存:实验心得:陈少琼:可变分区管理方式下采用最佳适应分配算法实现主存分配和回收是一个较好理解的算法,用C语言编写的参考程序要自己去补充定义,分析程序,理解算法,才可能去设计实验数据,进行实验,虽然会话多一点的时间,但是可以充分理解这个算法,和计算机主存的分配和回收情况。
兰晓铃:本实验的实验过程中还是遇到比较多的问题,程序编译时不能够一次通过,而是要不断的补充和定义,课堂上的最佳适应算法虽然通俗易懂,但要用这样基础的程序语言描述出来,并且编译通过还有相当大的距离,在老师和同学的帮助下终于实现可变分区管理方式下采用最优/佳适应分配算法实现主存的分配和回收。
附录:运行程序:#include "stdio.h"#include "conio.h"#define m 5#define n 5#define minisize 1struct{ float address;float length;int flag;} free_table[m];struct{ float address;float length;int flag;}used_table[n];allocate(char job,float xk) {int i,k;float ad;k=-1;for(i=0;i<=m;i++)if(free_table[i].length>=xk && free_table[i].flag==1) /*找到足够大,未分配的空闲区*/ if(k==-1 || free_table[i].length<free_table[k].length)k=i;if(k==-1){printf("allocation failure! \n");return;}if(free_table[k].length-xk<=minisize) /*直接分配*/{free_table[k].flag=0; /*标记为已分配*/ad=free_table[k].address;xk=free_table[k].length;}else{free_table[k].length=free_table[k].length-xk; /*分配分割*/ad=free_table[k].address+free_table[k].length;}i=0;while(used_table[i].flag!=0 &&i<n)i++;if(i>=n){printf("the used_table is full! \n");if(free_table[k].flag==0)free_table[k].flag=1;else{free_table[k].length=free_table[k].length+xk;return;}}else{used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=job;}return;}reclaim(char job)float S,L;s=0;while((used_table[s].flag!=job || used_table[s].flag==0)&&s<n) /*没找到匹配的作业,或表目为空*/ s++;if(s>=n){printf("can not find the job!\n");return;}used_table[s].flag=0;S=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;while(i<m &&(j==-1||k==-1)){if(free_table[i].flag==1){if(free_table[i].address+free_table[i].length==s)k=i;if(free_table[i].address==S+L)j=i;}i++;}if(k!=-1)if(j!=-1){free_table[k].length =free_table[j].length+free_table[k].length+L;free_table[j].flag=0;}elsefree_table[k].length=free_table[k].length+L;elseif(j!=-1){free_table[j].address=S;free_table[j].length=free_table[j].length+L;}else{t=0;while(free_table[t].flag==1&&t<m){printf("the free_table is full \n");used_table[s].flag=job ;return;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return;}main(){int i,a;float xk;char job;free_table[0].address=0;free_table[0].length=1024;free_table[0].flag=1;for(i=1;i<m;i++)free_table[i].flag=0; /*空表目*/for(i=0;i<n;i++)used_table[i].flag=0; /*空表目*/while(1) {printf("\n menu: 0--exit; 1--allocation; 2--reclaim; 3--list\n");printf("pls choose(0~3)");scanf("%d",&a);switch(a){case 0:exit(0);case 1:printf("pls enter the job and the memory length you want:\n");scanf("%*c%c %f",&job,&xk);allocate(job,xk);break;case 2:printf("pls enter the job you want to reclaim memory:\n");scanf("%*c%c",&job);reclaim(job);break;case 3: printf("the free table:\n address length flag\n:");for(i=0;i<m;i++)printf("%6.0f %9.0f %6d\n\n",free_table[i].address,free_table[i].length,free_table[i].flag);printf("the used_table:\n address length flag\n");/* if(used_table[i].flag!=0)printf("%6.0f %9.0f %6c\n",used_table[i].address,used_table[i].length,used_table[i].flag);else*/printf("%6.0f %9.0f %6c\n",used_table[i].address,used_table[i].length,used_table[i].flag);break;default:printf("no this choose!");}}}备注:以上各项空白处若填写不够,可自行扩展。