




已阅读5页,还剩6页未读, 继续免费阅读
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
昆明理工大学信息工程与自动化学院学生实验报告( 2012 2013 学年第 二 学期 )课程名称:操作系统 开课实验室:信自楼444 2013年 月 日年级、专业、班物联网111学号201110410125姓名丁洪超成绩实验项目名称 存储分区管理指导教师教师评语该同学是否了解实验内容与要求:A.了解B.基本了解C.不了解设计思想或流程图是否正确: A.正确B.基本正确C.较差 该同学的实验能力: A.强 B.中等 C.差 该同学的实验是否达到要求: A.达到B.基本达到C.未达到实验报告是否规范: A.规范B.基本规范C.不规范是否有运行结果与分析: A.详细B.一般 C.没有 是否有总结与体会: A.详细B.一般 C.没有 教师签名: 年 月 日注:报告内容按下列的要求进行。1、 实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。 通过编写和调试模拟程序以加强对虚拟存储管理的了解。2、 实验题目 设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以采用下面三种算法之一: 1、首次适应算法 2、循环首次适应算法 3最佳适应算法 4、必须建立空闲区表和占用区表,回收算法考虑四种情况。三、算法设计的思想或流程图 四、编写的相关程序代码#include#include #include#include#include#define n 10 /*假定系统允许的最大作业数为n,假定模拟实验中n值为10*/ #define m 10 /*假定系统允许的空闲区表最大为m,假定模拟实验中m值为10*/ #define minisize 100 /*空闲分区被分配时,如果分配后剩余的空间小于minisize,则将该空闲分区全部分配,若大于minisize,则切割分配*/struct float address; /*已分配分区起始地址*/ float length; /*已分配分区长度,单位为字节*/ int flag; /*已分配区表登记栏标志,用0表示空栏目*/ used_tablen; /*已分配区表*/struct float address; /*空闲区起始地址*/ float length; /*空闲区长度,单位为字节*/ int flag; /*空闲区表登记栏标志,用0表示空栏目,用1表示未分配*/ free_tablem; /*空闲区表*/void allocate(char J,float xk) /*给J作业,采用最佳分配算法分配xk大小的空间*/ int i,k; float ad; k=-1; for(i=0;i=xk&free_tablei.flag=1) if(k=-1|free_tablei.lengthfree_tablek.length) k=i; if(k=-1)/*未找到可用空闲区,返回*/ printf(无可用空闲区n); return; /*找到可用空闲区,开始分配:若空闲区大小与要求分配的空间差小于minisize大小,则空闲区全部分配;若空闲区大小与要求分配的空间差大于minisize大小,则从空闲区划出一部分分配*/ if(free_tablek.length-xk=minisize) free_tablek.flag=0; ad=free_tablek.address; xk=free_tablek.length; else free_tablek.length=free_tablek.length-xk; ad=free_tablek.address+free_tablek.length; /*修改已分配区表*/ i=0; while(used_tablei.flag!=0&i=n) /*无表目可填写已分配分区*/ printf(无表目填写已分分区,错误n); /*修正空闲区表*/ if(free_tablek.flag=0) /*前面找到的是整个空闲分区*/ free_tablek.flag=1; else /*前面找到的是某个空闲分区的一部分*/ free_tablek.length=free_tablek.length+xk; return; else /*修改已分配表*/ used_tablei.address=ad; used_tablei.length=xk; used_tablei.flag=J; return; /*主存分配函数结束*/void reclaim(char J) /*回收作业名为J的作业所占主存空间*/ int i,k,j,s,t; float S,L; /*寻找已分配表中对应登记项*/ s=0; while(used_tables.flag!=J|used_tables.flag=0)&s=n)/*在已分配表中找不到名字为J的作业*/ printf(找不到该作业n); return; /*修改已分配表*/ used_tables.flag=0; /*取得归还分区的起始地址S和长度L*/ S=used_tables.address; L=used_tables.length; j=-1;k=-1;i=0; /*寻找回收分区的空闲上下邻,上邻表目k,下邻表目j*/ while(im&(j=-1|k=-1) if(free_tablei.flag=1) if(free_tablei.address+free_tablei.length=S)k=i;/*找到上邻*/ if(free_tablei.address=S+L)j=i;/*找到下邻*/ i+; if(k!=-1) if(j!=-1) /* 上邻空闲区,下邻空闲区,三项合并*/ free_tablek.length=free_tablej.length+free_tablek.length+L; free_tablej.flag=0; else /*上邻空闲区,下邻非空闲区,与上邻合并*/ free_tablek.length=free_tablek.length+L; else if(j!=-1) /*上邻非空闲区,下邻为空闲区,与下邻合并*/ free_tablej.address=S; free_tablej.length=free_tablej.length+L; else /*上下邻均为非空闲区,回收区域直接填入*/ /*在空闲区表中寻找空栏目*/ t=0; while(free_tablet.flag=1&t=m)/*空闲区表满,回收空间失败,将已分配表复原*/ printf(主存空闲表没有空间,回收空间失败n); used_tables.flag=J; return; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1; return; /*主存回收函数结束*/int main( ) int i,a; float xk; char J; /*空闲分区表初始化:*/ free_table0.address=10240; /*起始地址假定为10240*/ free_table0.length=10240; /*长度假定为10240,即10k*/ free_table0.flag=1; /*初始空闲区为一个整体空闲区*/ for(i=1;im;i+) free_tablei.flag=0; /*其余空闲分区表项未被使用*/ /*已分配表初始化:*/ for(i=0;in;i+) used_tablei.flag=0; /*初始时均未分配*/ while(1) printf(#选择功能项:#n); printf( 0-退出 n); printf( 1-分配主存 n); printf( 2-回收主存 n); printf( 3-显示主存 n); printf( 选择功项(03) :); scanf(%d,&a); switch(a) case 0: exit(0); /*a=0程序结束*/ case 1: /*a=1分配主存空间*/ printf(输入作业名J和作业所需长度xk: ); scanf(%*c%c%f,&J,&xk); allocate(J,xk); /*分配主存空间*/ break; case 2: /*a=2回收主存空间*/ printf(输入要回收分区的作业名); scanf(%*c%c,&J); reclaim(J); /*回收主存空间*/ break; case 3: /*a=3显示主存情况*/ /*输出空闲区表和已分配表的内容*/ printf(输出空闲区表:n起始地址 分区长度 标志n); for(i=0;im;i+) printf(%6.0f%9.0f%6dn,free_tablei.address,free_tablei.length, free_tablei.flag); printf( 按任意键,输出已分配区表n); getch(); printf( 输出已分配区表:n起始地址 分区长度 标志n); for(i=0;in;i+) if(used_tablei.flag!=0) printf(%6.0f%9.0f%6cn,used_tablei.address,used_tablei.length, used_tablei.flag); else printf(%6.0f%9.0f%6dn,used_tablei.address,used_tablei.length, used_tablei.flag); break; default:printf(没有该选项n); /*case*/ /*while*/ return 1;/*主函数结束*/五、运行结果与分析现在我们开始运行程序选择3输出空闲分区的输出:接着再按任意键就可以显示已分配的区表。此时还没有任何的输入,所以显示了没有任何的起始地址与分区长度的变化!现在输入,1,接着按提示输入作业名与作业所需长度,我们依次输入a 255接着输入3即可看到空闲分区表,起始地址,分区长度 ,标志等,如图所示:那么我们输作业的长度是255,在没有任何的输入时分区长度有10240,之后为9985说明程序已经
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
评论
0/150
提交评论