模板实验2存储器的分配与回收.docx
- 文档编号:2821979
- 上传时间:2022-11-15
- 格式:DOCX
- 页数:14
- 大小:210.69KB
模板实验2存储器的分配与回收.docx
《模板实验2存储器的分配与回收.docx》由会员分享,可在线阅读,更多相关《模板实验2存储器的分配与回收.docx(14页珍藏版)》请在冰豆网上搜索。
模板实验2存储器的分配与回收
实验报告
学院(系)名称:
计算机与通信工程学院
姓名
学号
专业
计算机科学与技术
班级
2009级3班
实验项目
实验二:
存储器的分配与回收算法实现
课程名称
操作系统
课程代码
0668036
实验时间
2011年11月28日第7、8节
2011年12月1日第3、4节
2011年12月5日第7、8节
实验地点
软件实验室7-216
软件实验室7-219
软件实验室7-215
批改意见
成绩
教师签字:
实验内容:
1.模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。
(124)
2.采用最先适应法、最佳适应法、最坏适应法分配主存空间。
(124)
3.当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。
若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4.当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5.运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
实验要求:
1.详细描述实验设计思想、程序结构及各模块设计思路;
2.详细描述程序所用数据结构及算法;
3.明确给出测试用例和实验结果;
4.为增加程序可读性,在程序中进行适当注释说明;
5.认真进行实验总结,包括:
设计中遇到的问题、解决方法与收获等;
6.实验报告撰写要求结构清晰、描述准确逻辑性强;
7.实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
源程序:
usingSystem;
usingSystem.Collections.Generic;
usingSystem.Linq;
usingSystem.Text;
usingSystem.Collections;
namespaceshen_2
{
classsuit//分配主存空间的类
{
publicvoidzxSuit(ArrayListkzfq,intneedSize)//最先适应法
{
inti=0;
for(;i { if(needSize==Math.Abs((int)kzfq[i])&&(int)kzfq[i]>0)//与空闲分区大小相等 { Console.WriteLine("存放在第{0: 00}块\n",i+1); kzfq[i]=-(int)kzfq[i]; break; } if(needSize { Console.WriteLine("存放在第{0: 00}块\n",i+1); kzfq.Insert(i+1,(int)kzfq[i]-needSize); kzfq[i]=-needSize; break; } } if(i==kzfq.Count) { Console.WriteLine("没有足够大的空闲分区来存储! \n"); } } publicvoidzSuit(ArrayListkzfq,intneedSize,boolway)//最…适应法 {//布尔变量way为true时表示最优适应法,为false时表示最差适应法 inti=-1,balance;//int存储块号balance表示选择分区与目标大小的差额 if(way) { balance=int.MaxValue;//int.MaxValue表示int类型中最大数 } else { balance=int.MinValue;//int.MinValue表示int类型中最小数 } for(intj=0;j { if((int)kzfq[j]>0) { inttempBal=(int)kzfq[j]-needSize; if(tempBal>=0) { if(way) { if(tempBal { balance=tempBal; i=j; } } else { if(tempBal>balance) { balance=tempBal; i=j; } } } } } if(i==-1) { Console.WriteLine("没有足够大的空闲分区来存储! \n"); } else { Console.WriteLine("存放在第{0: 00}块\n",i+1); if(balance==0) { kzfq[i]=-(int)kzfq[i]; } else { kzfq.Insert(i+1,(int)kzfq[i]-needSize); kzfq[i]=-needSize; } } } } classrecover//回收主存的类 { publicrecover(ArrayListfqlb) { this.fqlb=fqlb; } publicvoidfindOccupied() { Console.Write("目前第"); for(inti=0;i { if((int)fqlb[i]<0) { Console.Write("{0: 00}块,",i+1); } } Console.WriteLine("被占用\n"); } publicvoidrecMemory(intsite)//回收类中的回收方法 { intrecSize=(int)fqlb[site]; intfontSize=0,afterSize=0; if(site! =0) { fontSize=(int)fqlb[site-1];//指定前一块分区 } if(site! =fqlb.Count-1) { afterSize=(int)fqlb[site+1];//指定后一块分区 } if(fontSize>0&&afterSize==0)//回收分区为最后一块且前一块空闲 { fqlb[site-1]=fontSize+(-recSize); fqlb.RemoveAt(site); } if(fontSize<0&&afterSize==0)//回收分区为最后一块且前一块被占用 { fqlb[site]=-recSize; } if(fontSize==0&&afterSize>0)//回收分区为第一块且后一块被空闲 { fqlb[site]=-recSize+afterSize; fqlb.RemoveAt(site+1); } if(fontSize==0&&afterSize<0)//回收分区为第一块且后一块被占用 { fqlb[site]=-recSize; } if(fontSize<0&&afterSize>0)//回收分区为中间块且前一块占用,后一块空闲 { fqlb[site]=-recSize+afterSize; fqlb.RemoveAt(site+1); } if(fontSize>0&&afterSize<0)//回收分区为中间块且前一块空闲,后一块占用 { fqlb[site-1]=fontSize+(-recSize); fqlb.RemoveAt(site); } if(fontSize>0&&afterSize>0)//回收分区为中间块且前后两均空闲 { fqlb[site-1]=fontSize+-recSize+afterSize; //fqlb.RemoveAt(site); //fqlb.RemoveAt(site+1); } if(fontSize<0&&afterSize<0)//回收分区为中间块且前后两均占用 { fqlb[site]=-recSize; } } ArrayListfqlb; } classProgram { staticvoidMain(string[]args) { ArrayListfqlb=newArrayList();//模拟内存分区的集合类 suitmySuit=newsuit(); recovermyRec=newrecover(fqlb); foreach(intsizeinnewint[10]{10,30,35,20,15,40,80,20,20,-25}) {//并测试添加的10个空闲分区 fqlb.Add(size);//用符号位表示分区是不占用: 正数表示未使用,负数表示已占用 } Console.WriteLine("设置的10个空闲分区大小为: \n"); for(inti=0;i { Console.WriteLine("第{0: 00}号分区: 状态: 空闲,分区大小: {1}\n",i+1,fqlb[i]); } Console.WriteLine("----------------------------------------\n"); Console.Write("输入工作个数: "); intc=Int32.Parse(Console.ReadLine()); for(intn=0;n { Console.WriteLine("第{0: 00}号分区: \n",n+1); Console.Write("输入工作所需内存: "); inta=Int32.Parse(Console.ReadLine()); Console.Write("输入分配内存空间适应方法: 1.最优适应算法,2.最差适应算法,3.最先适应算法(输入1或2或3): "); intb=Int32.Parse(Console.ReadLine()); switch(b) { case1: mySuit.zSuit(fqlb,a,true); break; case2: mySuit.zSuit(fqlb,a,false); break; case3: mySuit.zxSuit(fqlb,a); break
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 模板 实验 存储器 分配 回收