模板实验2存储器的分配与回收_第1页
模板实验2存储器的分配与回收_第2页
模板实验2存储器的分配与回收_第3页
模板实验2存储器的分配与回收_第4页
模板实验2存储器的分配与回收_第5页
已阅读5页,还剩7页未读 继续免费阅读

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、实验报告学院(系)名称:计算机与通信工程学院姓名赵云鹏学号20091931专业计算机科学与技术班级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. 当一

2、个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。实验要求:1 详细描述实验设计思想、程序结构及各模块设计思路;2 详细描述程序所用数据结构及算法;3 明确给出测试用例和实验结果;4 为增加程序可读性,在程序中进行适当注释说明;5 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6 实验报告撰写要求结构清晰

3、、描述准确逻辑性强;7 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】源程序:using System;using System.Collections.Generic;using System.Linq;using System.Text;using System.Collections;namespace shen_2 class suit /分配主存空间的类 public void zxSuit(ArrayList kzfq, int needSize) /最先适应法 int i = 0; for (; i <

4、kzfq.Count; i+) if (needSize = Math.Abs(int)kzfqi) && (int)kzfqi > 0)/与空闲分区大小相等 Console.WriteLine("存放在第0:00块n", i + 1); kzfqi = -(int)kzfqi; break; if (needSize < Math.Abs(int)kzfqi) && (int)kzfqi > 0)/小于空闲分区大小 Console.WriteLine("存放在第0:00块n", i + 1); kzfq

5、.Insert(i + 1, (int)kzfqi - needSize); kzfqi = -needSize; break; if (i = kzfq.Count) Console.WriteLine("没有足够大的空闲分区来存储!n"); public void zSuit(ArrayList kzfq, int needSize, bool way) /最适应法 /布尔变量way为true时表示最优适应法,为false时表示最差适应法 int i = -1, balance; /int存储块号 balance表示选择分区与目标大小的差额 if (way) balan

6、ce = int.MaxValue; /int.MaxValue表示int类型中最大数 else balance = int.MinValue; /int.MinValue表示int类型中最小数 for (int j = 0; j < kzfq.Count; j+) if (int)kzfqj > 0) int tempBal = (int)kzfqj - needSize; if (tempBal >= 0) if (way) if (tempBal < balance) balance = tempBal; i = j; else if (tempBal >

7、balance) balance = tempBal; i = j; if (i = -1) Console.WriteLine("没有足够大的空闲分区来存储!n"); else Console.WriteLine("存放在第0:00块n", i + 1); if (balance = 0) kzfqi = -(int)kzfqi; else kzfq.Insert(i + 1, (int)kzfqi - needSize); kzfqi = -needSize; class recover /回收主存的类 public recover(ArrayLis

8、t fqlb) this.fqlb = fqlb; public void findOccupied() Console.Write("目前第 "); for (int i = 0; i < fqlb.Count; i+) if (int)fqlbi < 0) Console.Write("0:00块, ", i + 1); Console.WriteLine("被占用n"); public void recMemory(int site) /回收类中的回收方法 int recSize = (int)fqlbsite; i

9、nt fontSize = 0, afterSize = 0; if (site != 0) fontSize = (int)fqlbsite - 1; /指定前一块分区 if (site != fqlb.Count - 1) afterSize = (int)fqlbsite + 1; /指定后一块分区 if (fontSize > 0 && afterSize = 0) /回收分区为最后一块且前一块空闲 fqlbsite - 1 = fontSize + (-recSize); fqlb.RemoveAt(site); if (fontSize < 0 &

10、;& afterSize = 0) /回收分区为最后一块且前一块被占用 fqlbsite = -recSize; if (fontSize = 0 && afterSize > 0) /回收分区为第一块且后一块被空闲 fqlbsite = -recSize + afterSize; fqlb.RemoveAt(site + 1); if (fontSize = 0 && afterSize < 0) /回收分区为第一块且后一块被占用 fqlbsite = -recSize; if (fontSize < 0 && aft

11、erSize > 0) /回收分区为中间块且前一块占用,后一块空闲 fqlbsite = -recSize + afterSize; fqlb.RemoveAt(site + 1); if (fontSize > 0 && afterSize < 0) /回收分区为中间块且前一块空闲,后一块占用 fqlbsite - 1 = fontSize + (-recSize); fqlb.RemoveAt(site); if (fontSize > 0 && afterSize > 0) /回收分区为中间块且前后两均空闲 fqlbsite

12、- 1 = fontSize + -recSize + afterSize; /fqlb.RemoveAt(site); /fqlb.RemoveAt(site + 1); if (fontSize < 0 && afterSize < 0) /回收分区为中间块且前后两均占用 fqlbsite = -recSize; ArrayList fqlb; class Program static void Main(string args) ArrayList fqlb = new ArrayList(); /模拟内存分区的集合类 suit mySuit = new su

13、it(); recover myRec = new recover(fqlb); foreach (int size in new int10 10, 30, 35, 20, 15, 40, 80, 20, 20, -25 ) /并测试添加的10个空闲分区 fqlb.Add(size); /用符号位表示分区是不占用:正数表示未使用,负数表示已占用 Console.WriteLine("设置的10个空闲分区大小为:n"); for (int i = 0; i < fqlb.Count; i+) Console.WriteLine("第0:00号分区:状态:空闲

14、,分区大小:1n", i + 1, fqlbi); Console.WriteLine("-n"); Console.Write("输入工作个数: "); int c = Int32.Parse(Console.ReadLine(); for (int n = 0; n < c; n+) Console.WriteLine("第0:00号分区:n", n+1); Console.Write("输入工作所需内存:"); int a = Int32.Parse(Console.ReadLine(); C

15、onsole.Write("输入分配内存空间适应方法:1.最优适应算法,2.最差适应算法,3.最先适应算法(输入1或2或3): "); int b = Int32.Parse(Console.ReadLine(); switch (b) case 1: mySuit.zSuit(fqlb, a, true); break; case 2: mySuit.zSuit(fqlb, a, false); break; case 3: mySuit.zxSuit(fqlb, a); break; / mySuit.zSuit(fqlb, a, true); for (int i =

16、 0; i < fqlb.Count; i+) if (int)fqlbi > 0) Console.WriteLine("第0:00号分区:状态:(空闲),分区大小:1n", i + 1, fqlbi); else Console.WriteLine("第0:00号分区:状态:(占用),分区大小:1n", i + 1, -(int)fqlbi); myRec.findOccupied(); Console.Write("输入回收主存个数: "); int v = Int32.Parse(Console.ReadLine(

17、); for (int j = 0; j < v; j+) Console.WriteLine("第0:00轮回收:n", j+ 1); int site; while (true) /由用户输入要回收的块号并对异常进行处理 Console.Write("要回收的主存块号为:"); try site = Int32.Parse(Console.ReadLine(); if (site <= 0 | site > fqlb.Count) Console.WriteLine("n请输入合理数值n"); continue;

18、 if (int)fqlbsite - 1 > 0) Console.WriteLine("n此块没有被占用n"); continue; break; catch (System.Exception ex) Console.WriteLine("n请输入合法数值!n"); Console.WriteLine(); site-; myRec.recMemory(1); /调用类中的回收方法 for (int i = 0; i < fqlb.Count; i+) /循环输出 if (int)fqlbi > 0) Console.WriteLine("第0:00号分区:(空闲),大小:1n",

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论