1、2011 年12月1 日 第3、4节2011 年12月5 日 第7、8节实验地点软件实验室7-216软件实验室7-219软件实验室7-215批改意见成绩教师签字: 实验内容:1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。(124)2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4. 当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,
2、登在空闲区表中。5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。实验要求:1 详细描述实验设计思想、程序结构及各模块设计思路;2 详细描述程序所用数据结构及算法;3 明确给出测试用例和实验结果;4 为增加程序可读性,在程序中进行适当注释说明;5 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6 实验报告撰写要求结构清晰、描述准确逻辑性强;7 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。【实验过程记录(源程序、测试用例、测试结果及心得体会等)】源程序:using System;using System.Collections.Generic;usi
3、ng 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 0)/与空闲分区大小相等 Console.WriteLine(存放在第0:00块n, i + 1); kzfqi = -(int)kzfqi; break; if (needSize Math.Abs(int)kzfqi) & 0)/小于空闲分区大小 kz
4、fq.Insert(i + 1, (int)kzfqi - needSize); kzfqi = -needSize; if (i = kzfq.Count)没有足够大的空闲分区来存储!n); public void zSuit(ArrayList kzfq, int needSize, bool way) /最适应法 /布尔变量way为true时表示最优适应法,为false时表示最差适应法 int i = -1, balance; /int存储块号 balance表示选择分区与目标大小的差额 if (way) balance = int.MaxValue; /int.MaxValue表示in
5、t类型中最大数 else balance = int.MinValue; /int.MinValue表示int类型中最小数 for (int j = 0; j 0) int tempBal = (int)kzfqj - needSize; if (tempBal = 0) if (tempBal balance) balance = tempBal; i = j; if (i = -1) if (balance = 0) class recover /回收主存的类 public recover(ArrayList fqlb) this.fqlb = fqlb; public void find
6、Occupied() Console.Write(目前第 for (int i = 0; fqlb.Count; if (int)fqlbi 0 & afterSize = 0) /回收分区为最后一块且前一块空闲 fqlbsite - 1 = fontSize + (-recSize); fqlb.RemoveAt(site); if (fontSize 0) /回收分区为第一块且后一块被空闲 fqlbsite = -recSize + afterSize; fqlb.RemoveAt(site + 1); afterSize 0) /回收分区为第一块且后一块被占用 0) /回收分区为中间块且
7、前一块占用,后一块空闲 0) /回收分区为中间块且前一块空闲,后一块占用 0) /回收分区为中间块且前后两均空闲 fqlbsite - 1 = fontSize + -recSize + afterSize; /fqlb.RemoveAt(site); /fqlb.RemoveAt(site + 1); 0) /回收分区为中间块且前后两均占用 ArrayList fqlb; class Program static void Main(string args) ArrayList fqlb = new ArrayList(); /模拟内存分区的集合类 suit mySuit = new sui
8、t(); 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); /用符号位表示分区是不占用:正数表示未使用,负数表示已占用设置的10个空闲分区大小为:第0:00号分区:状态:空闲,分区大小:1n, i + 1, fqlbi);-n输入工作个数: int c = Int32.Parse(Console.ReadLine(); for (int n = 0; n c; n+)00号分区:, n+1);输入工作所需内存: int a = Int32.Parse(Console.ReadLine();输入分配内存空间适应方法:1.最优适应算法,2.最差适应算法,3.最先适应算法(输入1或2或3): int b = Int32.Parse(Console.ReadLine(); switch (b) case 1: mySuit.zSuit(fqlb, a, true); case 2: mySuit.zSuit(fqlb, a, false); case 3: mySuit.zxSuit(fqlb, a); break
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1