实验报告学院(系)名称:计算机与通信工程学院【实验过程记录(源程序、测试用例、测试结果及心得体会等)】源程序:MemoryBlock.java://内存块类,包含各种操作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;}public MemoryBlock(int base, int blockNum) { this.baseBlock = base;this.blockNum = blockNum;inUse = false;prev = null;next = null;}public int getBlockNum() {return blockNum;}public void setBlockNum(int blockNum) {this.blockNum = blockNum;}public MemoryBlock getPrev() {return prev;}public void setPrev(MemoryBlock prev) {this.prev = prev;}public MemoryBlock getNext() {;next return}setNext(MemoryBlock 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 MemoryBlockallocate(int - blockNum>0) { blockNum(this.if+ blockNum; newBase = baseBlock int-blockNum; . this int newBlock = blockNum = blockNum; blockNum .thissetUse();MemoryBlock(newBase, newBlock); new return}- blockNum ==0) { else this(if blockNum. = 0;blockNum . this};null return}//判断内存块是否能合并public boolean merge(MemoryBlock memBlock) {if(baseBlock+blockNum ==memBlock.getBaseBlock()) {setBlockNum(blockNum+memBlock.blockNum );memBlock.setBaseBlock(0);memBlock.setBlockNum(0);return true ;}else;false return}@OverrideString toString() { public;String inUse = null; 已分配 (inUse())inUse = if;未分配else inUse = +blockNum + + 基地址return内存块 [尽 + baseBlock, 大小尽; + inUse + ?尠嵜}}MemoryTable.java:,提供内存链表的各种基本方法MemTable//虚类public abstract class MemoryTable {//MemoryBlock链表表头protected MemoryBlock memList;blockNum) { MemoryTable( intpublic MemoryBlock(0, blockNum); memList = new}//把newBlock前面插入到memBlockinsertBefore(MemoryBlock memBlock, MemoryBlock public voidnewBlock){) (memBlock.getPrev() != ifnull memBlock.getPrev().setNext(newBlock);== memBlock)if( memList = newBlock; memListnewBlock.setPrev(memBlock.getPrev());newBlock.setNext(memBlock);memBlock.setPrev(newBlock);}//在memBlock后插入newBlockpublic void insert(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 == memList if= memBlock.getNext();memList) if(memBlock.getNext()!=null memBlock.getNext().setPrev(memBlock.getPrev());) if(memBlock.getPrev()!=null memBlock.getPrev().setNext(memBlock.getNext());}print() { public void; memList MemoryBlock memBlock =i=0;int) { (memBlock != nullwhile); .print(i+ out?System..println(memBlock); out System.i++;memBlock = memBlock.getNext();}}合并邻接的空闲内存// merge(MemoryBlock newBlock) { voidpublic; MemoryBlock memBlock = memList) { (memBlock != while null(!memBlock.inUse()) { if(memBlock.merge(newBlock)) {ifmemBlock.setBlockNum( memBlock.getBlockNum() +newBlock.getBlockNum());remove(newBlock);break;}if(newBlock.merge(memBlock)) {newBlock.setBlockNum( newBlock.getBlockNum() +memBlock.getBlockNum());remove(memBlock);break;}}memBlock = memBlock.getNext();}}// 分配内存(抽象函数)public abstract boolean allocate(int blockNum);//释放内存(抽象函数)public abstract boolean free(int baseBlock);}FirstFit.java:public class FirstFit extends MemoryTable{public FirstFit(int blockNum) {(blockNum);super}@OverrideblockNum) { int boolean allocate(public; memList MemoryBlock memBlock = ) { (memBlock!=null while(!memBlock.inUse()) { if(memBlock.getBlockNum()>blockNum) { if MemoryBlock newBlock =memBlock.allocate(blockNum);insert(memBlock, newBlock);;true return}(memBlock.getBlockNum()==blockNum) { elseifmemBlock.setUse();}}memBlock = memBlock.getNext();};false return}分配内存(类内使用)//freeMemory(MemoryBlock freeBlock) { void MemoryBlock prev =freeBlock.getPrev();MemoryBlock next = freeBlock.getNext();freeBlock.free();) { null(freeBlock.getPrev()!=ifwhile(!prev.inUse() && (prev.merge(freeBlock))) {prev.setBlockNum( prev.getBlockNum() +freeBlock.getBlockNum());remove(freeBlock);freeBlock = prev;if(freeBlock.getPrev()!= null )prev = freeBlock.getPrev();else return ;}}if (freeBlock.getNext()!=null) {while (!next.inUse() && (freeBlock.merge(next))) {freeBlock.setBlockNum ( next.getBlockNum() + freeBlock.getBlockNum());remove(next);freeBlock = next;if (freeBlock.getNext()!=null )next = freeBlock.getNext();else return ;}}}@Overridepublic boolean free(int baseBlock) {MemoryBlock memBlock = memList;while(memBlock != null) {if (memBlock.getBaseBlock() == baseBlock) {freeMemory(memBlock);return true ;}memBlock = memBlock.getNext();};return false}}BestFit.java:public class BestFit extends MemoryTable {private MemoryBlock usedMemory;public BestFit( int blockNum) {super (blockNum);;null = usedMemory}@Overridepublic boolean allocate(int blockNum) {MemoryBlock memBlock = memList;MemoryBlock minBlock = null ;for(;memBlock!=null ; memBlock = memBlock.getNext()) {if(!memBlock.inUse()&&(memBlock.getBlockNum()>=blockNum)) { minBlock = memBlock;;break}}) { if (minBlock != null remove(minBlock);(minBlock.getBlockNum()!=blockNum) { if MemoryBlock newBlock = minBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(minBlock);;true return}else; false return}freeMemory(MemoryBlock freeBlock) { boolean) { (freeBlock != if nullfreeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);;true return};false return}@Override baseBlock) { int free( publicboolean; MemoryBlock memBlock = usedMemory) { while(memBlock != null(memBlock.getBaseBlock() == baseBlock){ if freeMemory(memBlock);merge(memBlock);;true return}memBlock = memBlock.getNext();}return false;}//在已分配链表删除removeUsed(MemoryBlock memBlock) { public void if(memBlock == usedMemory) usedMemory = memBlock.getNext();nullif(memBlock.getNext()!=)memBlock.getNext().setPrev(memBlock.getPrev());)if(memBlock.getPrev()!=nullmemBlock.getPrev().setNext(memBlock.getNext());}插入未分配链表//void insertUnused(MemoryBlock newBlock) {== memList null) if( memList = newBlock;else {; MemoryBlock memBlock = memList; MemoryBlock preBlock = null while(memBlock!=) { null(newBlock.getBlockNum()<=memBlock.getBlockNum()) { ifinsertBefore(memBlock, newBlock);return ;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}//插入已分配链表void insertUsed(MemoryBlock newBlock) {usedMemory if( == ) null = newBlock;usedMemory{else MemoryBlock memBlock = ; usedMemory null(memBlock.getNext() != ) while memBlock = memBlock.getNext();memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}public void print() {super .print();MemoryBlock memBlock = usedMemory;int i=0;while(memBlock != null ) {System. out.print(i+ ?);System.out .println(memBlock);i++;memBlock = memBlock.getNext();}}}WorstFit.java:public class WorstFit extends MemoryTable {//已分配链表;usedMemory MemoryBlock privateblockNum) { int WorstFit( public(blockNum); super;null = usedMemory}@Override blockNum) { publicint allocate(boolean; memList MemoryBlock maxBlock =(maxBlock.getBlockNum()<blockNum) if;false returnremove(maxBlock);(maxBlock.getBlockNum()!=blockNum) { ifMemoryBlock newBlock = maxBlock.allocate(blockNum);insertUnused(newBlock);}insertUsed(maxBlock);;true return}freeMemory(MemoryBlock freeBlock) { boolean) { if (freeBlock != nullfreeBlock.free();removeUsed(freeBlock);insertUnused(freeBlock);;true return}false;return}@OverridebaseBlock) { public boolean free(int已分配链表// ; MemoryBlock memBlock = usedMemory(memBlock != null) { while(memBlock.getBaseBlock() == baseBlock) { if freeMemory(memBlock);merge(memBlock);true;return }memBlock = memBlock.getNext();}false;return}void removeUsed(MemoryBlock memBlock) { public) if(memBlock == usedMemory = memBlock.getNext();usedMemory) null if(memBlock.getNext()!=memBlock.getNext().setPrev(memBlock.getPrev());) null if(memBlock.getPrev()!=memBlock.getPrev().setNext(memBlock.getNext());}void insertUnused(MemoryBlock newBlock) {== null) memList if ( = newBlock;memList else {MemoryBlock memBlock = memList;MemoryBlock preBlock = null;) { (memBlock!= whilenull if(newBlock.getBlockNum()>=memBlock.getBlockNum()) {insertBefore(memBlock, newBlock);return;}preBlock = memBlock;memBlock = memBlock.getNext();}insert(preBlock, newBlock);}}void insertUsed(MemoryBlock newBlock) {if(usedMemory == null)usedMemory = newBlock;else {; MemoryBlock memBlock = usedMemory) while (memBlock.getNext() != null memBlock = memBlock.getNext(); memBlock.setNext(newBlock);newBlock.setPrev(memBlock);}}print() { voidpublic.print();super; usedMemory MemoryBlock memBlock =i=0;int) { (memBlock != nullwhile); System. out.print(i+?.println(memBlock); System. out i++;memBlock = memBlock.getNext();}}}测试用例:Main.java:public class Main {public static void main(String[] args) {testFirstFit();System.out .println();testBestFit ();System.out.println();();testWorstFit}testFirstFit() { publicstatic voidFirstFit(1024); MemoryTable mem = new); out System..println(测试首次适应法尺mem.allocate(512);mem.allocate(256);mem.allocate(128);mem.print();mem.free(512);mem.free(768);mem.print();}public static void testBestFit() {MemoryTable mem = new BestFit(1024);System.out.println(测试最佳适应法尺 );mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(1);mem.print();}testWorstFit() { void static publicWorstFit(1024); MemoryTable mem = new); 尺测试最坏适应法out System..println(mem.allocate(1);mem.allocate(2);mem.allocate(3);mem.print();mem.free(0);mem.free(3);mem.print();}}测试结果:测试首次适应法:分配 512 内存分配 256 内存分配 128 内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=256, 已分配]2 内存块 [基地址=768, 大小=128, 已分配]3 内存块 [基地址=896, 大小=128, 未分配] 释放 512 处内存释放 768 处内存内存单元:0 内存块 [基地址=0, 大小=512, 已分配]1 内存块 [基地址=512, 大小=512, 未分配]测试最佳适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 1 处内存内存单元:0 内存块 [基地址=0, 大小=3, 未分配]1 内存块 [基地址=6, 大小=1018, 未分配] 0 内存块 [基地址=3, 大小=3, 已分配]测试最坏适应法:分配 1 内存分配 2 内存分配 3 内存内存单元:0 内存块 [基地址=6, 大小=1018, 未分配]0 内存块 [基地址=0, 大小=1, 已分配]1 内存块 [基地址=1, 大小=2, 已分配]2 内存块 [基地址=3, 大小=3, 已分配]释放 0 处内存释放 3 处内存内存单元:0 内存块 [基地址=3, 大小=1021, 未分配]1 内存块 [基地址=0, 大小=1, 未分配]0 内存块 [基地址=1, 大小=2, 已分配]心得体会:1.使用类来进行一些方法的重用释放内存时,根据不同的分配方法进行相邻的内存合并 2.。