1、课程代码 0668036 实验时间 8节 第7、122012 年月13日节17 2012 年12月日 第3、4 7、8节 2012 年12月20 日 第实验地点 软件实验室7-215 批改意见 成绩 教师签字:实验内容:1. 模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。2. 采用最先适应法、最佳适应法、最坏适应法分配主存空间。3. 当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。4. 当一个作业撤离时,归还的区域如果与其他空闲
2、区相邻,则应合并成一个较大的空闲区,登在空闲区表中。5. 运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。实验要求:1 详细描述实验设计思想、程序结构及各模块设计思路;2 详细描述程序所用数据结构及算法;3 明确给出测试用例和实验结果;4 为增加程序可读性,在程序中进行适当注释说明;5 认真进行实验总结,包括:设计中遇到的问题、解决方法与收获等;6 实验报告撰写要求结构清晰、描述准确逻辑性强; 实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。 7【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 源程序:MemoryBlock.java:/内存块类,包含各种操作
3、 public class MemoryBlock static final int BLOCK_SIZE = 4096; private int baseBlock; /内存块基地址 private int blockNum; /大小 private boolean inUse; /是否已分配 private MemoryBlock prev, next; public MemoryBlock(int blockNum) this.baseBlock = 0; this.blockNum = blockNum; inUse = false; prev = null; next = null;
4、 public MemoryBlock(int base, int blockNum) this.baseBlock = base; public int getBlockNum() return blockNum; public void setBlockNum(int blockNum) public MemoryBlock getPrev() return prev; public void setPrev(MemoryBlock prev) this.prev = prev; public MemoryBlock getNext() ;next return setNext(Memor
5、yBlock next) public void = next; next.this inUse() public boolean ; inUse return setUse() voidpublic true = inUse free() void public false = inUse getBaseBlock() public int; baseBlock return baseBlock) int public void setBaseBlock( = baseBlock; baseBlock .this 分配内存块,如果可分配,则返回剩余内存块 / blockNum) public
6、 MemoryBlock allocate(int - blockNum0) blockNum(this.if + blockNum; newBase = baseBlock int-blockNum; . this int newBlock = blockNum = blockNum; blockNum .this setUse(); MemoryBlock(newBase, newBlock); new return - blockNum =0) else this(if blockNum. = 0;blockNum . this null return /判断内存块是否能合并 publi
7、c boolean merge(MemoryBlock memBlock) if(baseBlock+blockNum =memBlock.getBaseBlock() setBlockNum(blockNum+memBlock.blockNum );memBlock.setBaseBlock(0);memBlock.setBlockNum(0);return true ; else;false return Override String toString() public; String inUse = null; 已分配 (inUse()inUse = if; 未分配else inUse
8、 = + blockNum + + 基地址 return内存块 尽 + baseBlock, 大小尽; + inUse + ?尠嵜 MemoryTable.java: ,提供内存链表的各种基本方法MemTable/虚类public abstract class MemoryTable /MemoryBlock链表表头 protected MemoryBlock memList; blockNum) MemoryTable( intpublic MemoryBlock(0, blockNum); memList = new /把newBlock前面插入到memBlock insertBefore
9、(MemoryBlock memBlock, MemoryBlock public void newBlock) ) (memBlock.getPrev() != ifnullmemBlock.getPrev().setNext(newBlock); = memBlock) if( memList = newBlock; memList newBlock.setPrev(memBlock.getPrev();newBlock.setNext(memBlock);memBlock.setPrev(newBlock); /在memBlock后插入newBlock public void inser
10、t(MemoryBlock memBlock, MemoryBlock newBlock) if(memBlock.getNext() != null) memBlock.getNext().setPrev(newBlock);newBlock.setNext(memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock); 删除块的连接关系,但不释放块/ remove(MemoryBlock memBlock) voidpublic ) (memBlock = memListif = memBlock.getN
11、ext();memList ) if(memBlock.getNext()!= nullmemBlock.getNext().setPrev(memBlock.getPrev();) if(memBlock.getPrev()!= nullmemBlock.getPrev().setNext(memBlock.getNext(); print() public void memList MemoryBlock memBlock = i=0; int) (memBlock != nullwhile); .print(i+ out?System.println(memBlock); out Sys
12、tem.i+;memBlock = memBlock.getNext(); 合并邻接的空闲内存/ merge(MemoryBlock newBlock) voidpublic MemoryBlock memBlock = memList) (memBlock != while null(!memBlock.inUse() if (memBlock.merge(newBlock) if memBlock.setBlockNum( memBlock.getBlockNum() + newBlock.getBlockNum(); remove(newBlock);break;if(newBlock.merge(memBlock) newBlock.setBlockNum( newBlock.getBlockNum() + memBlock.getBlockNum();remove(memBlock); break;/ 分配内存(抽象函数) public abstract boolean allocate(int blockNum);/释放内存(抽象函数) public abstract boolean free(int baseBlock);FirstFit.java:public class FirstFit extends MemoryTable public FirstFit(i
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1