天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
更新时间:2023-09-03 16:20:01 阅读量: 教育文库 文档下载
- 天津理工大学推荐度:
- 相关推荐
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
实验报告
学院(系)名称:计算机与通信工程学院
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】 源程序:
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() { } public void setNext(MemoryBlock next) { } public boolean inUse() { } public void setUse() { } public void free() { } public int getBaseBlock() { } public void setBaseBlock(int baseBlock) { } //分配内存块,如果可分配,则返回剩余内存块 public MemoryBlock allocate(int blockNum) { } if(this.blockNum - blockNum>0) { } else if(this.blockNum - blockNum ==0) { } return null; this.blockNum = 0; int newBase = baseBlock + blockNum; int newBlock = this.blockNum-blockNum; this.blockNum = blockNum; setUse(); return new MemoryBlock(newBase, newBlock); this.baseBlock = baseBlock; return baseBlock; inUse = false; inUse = true; return inUse; this.next = next; return next;
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
} public boolean merge(MemoryBlock memBlock) { } @Override public String toString() { } String inUse = null; if(inUse())inUse = "已分配"; else inUse = "未分配"; return "内存块 [基地址=" + baseBlock + ", 大小=" + blockNum + ", " + inUse + "]"; if(baseBlock+blockNum==memBlock.getBaseBlock()) { } else return false; setBlockNum(blockNum+memBlock.blockNum); memBlock.setBaseBlock(0); memBlock.setBlockNum(0); return true;
MemoryTable.java:
//虚类MemTable,提供内存链表的各种基本方法
public abstract class MemoryTable {
//MemoryBlock链表表头 protected MemoryBlock memList; public MemoryTable(int blockNum) { } //把newBlock插入到memBlock前面 public void insertBefore(MemoryBlock memBlock, MemoryBlock } if(memBlock.getPrev() != null) memBlock.getPrev().setNext(newBlock); memList = newBlock; if(memList == memBlock) newBlock.setPrev(memBlock.getPrev()); newBlock.setNext(memBlock); memBlock.setPrev(newBlock); memList = new MemoryBlock(0, blockNum); newBlock){
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
public void insert(MemoryBlock memBlock, MemoryBlock newBlock) { } //删除块的连接关系,但不释放块 public void remove(MemoryBlock memBlock) { } public void print() { } //合并邻接的空闲内存 public void merge(MemoryBlock newBlock) { MemoryBlock memBlock = memList; while(memBlock != null) { if(!memBlock.inUse()) { if(memBlock.merge(newBlock)) {
memBlock.setBlockNum( memBlock.getBlockNum() +
newBlock.getBlockNum()); MemoryBlock memBlock = memList; int i=0; while(memBlock != null) { } System.out.print(i+" "); System.out.println(memBlock); i++; memBlock = memBlock.getNext(); if(memBlock == memList) memList = memBlock.getNext(); memBlock.getNext().setPrev(memBlock.getPrev()); memBlock.getPrev().setNext(memBlock.getNext()); if(memBlock.getNext()!=null) if(memBlock.getPrev()!=null) if(memBlock.getNext() != null) memBlock.getNext().setPrev(newBlock); newBlock.setNext(memBlock.getNext()); memBlock.setNext(newBlock); newBlock.setPrev(memBlock);
} remove(newBlock); break; if(newBlock.merge(memBlock)) { newBlock.setBlockNum( newBlock.getBlockNum() + remove(memBlock);
memBlock.getBlockNum());
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
} } } } } break; memBlock = memBlock.getNext(); //分配内存(抽象函数) public abstract boolean allocate(int blockNum); //释放内存(抽象函数) public abstract boolean free(int baseBlock);
FirstFit.java:
public class FirstFit extends MemoryTable{
@Override public boolean allocate(int blockNum) { } //分配内存(类内使用) void freeMemory(MemoryBlock freeBlock) { MemoryBlock prev = freeBlock.getPrev(); MemoryBlock next = freeBlock.getNext(); freeBlock.free(); if(freeBlock.getPrev()!=null) {
public FirstFit(int blockNum) { } super(blockNum); MemoryBlock memBlock = memList; while(memBlock!=null) { } return false; if(!memBlock.inUse()) { } memBlock = memBlock.getNext(); if(memBlock.getBlockNum()>blockNum) { } else if(memBlock.getBlockNum()==blockNum) { } memBlock.setUse(); MemoryBlock newBlock = memBlock.allocate(blockNum); insert(memBlock, newBlock); return true;
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
while(!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; @Override public boolean free(int baseBlock) { } MemoryBlock memBlock = memList; while(memBlock != null) { } return false; if(memBlock.getBaseBlock() == baseBlock) { } memBlock = memBlock.getNext(); freeMemory(memBlock); return true;
BestFit.java:
public class BestFit extends MemoryTable {
private MemoryBlock usedMemory; public BestFit(int blockNum) { } super(blockNum); usedMemory = null;
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
@Override public boolean allocate(int blockNum) { } boolean freeMemory(MemoryBlock freeBlock) { } @Override public boolean free(int baseBlock) { MemoryBlock memBlock = usedMemory; while(memBlock != null) { }
MemoryBlock memBlock = memList; MemoryBlock minBlock = null; for(;memBlock!=null; memBlock = memBlock.getNext()) { } if(minBlock != null) { } else return false; remove(minBlock); if(minBlock.getBlockNum()!=blockNum) { } insertUsed(minBlock); return true; MemoryBlock newBlock = minBlock.allocate(blockNum); insertUnused(newBlock); if(!memBlock.inUse()&&(memBlock.getBlockNum()>=blockNum)) { } minBlock = memBlock; break; if(freeBlock != null) { } return false; freeBlock.free(); removeUsed(freeBlock); insertUnused(freeBlock); return true; if(memBlock.getBaseBlock() == baseBlock) { } memBlock = memBlock.getNext(); freeMemory(memBlock); merge(memBlock); return true;
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
return false;
}
//在已分配链表删除
public void removeUsed(MemoryBlock memBlock) {
if(memBlock == usedMemory)
usedMemory = memBlock.getNext();
if(memBlock.getNext()!=null)
memBlock.getNext().setPrev(memBlock.getPrev());
if(memBlock.getPrev()!=null)
memBlock.getPrev().setNext(memBlock.getNext());
}
//插入未分配链表
void insertUnused(MemoryBlock newBlock) {
if(memList == null)
memList = newBlock;
else {
MemoryBlock memBlock = memList;
MemoryBlock preBlock = null;
while(memBlock!=null) {
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);
}
}
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
} 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 {
boolean freeMemory(MemoryBlock freeBlock) { if(freeBlock != null) { freeBlock.free(); removeUsed(freeBlock); insertUnused(freeBlock); return true;
//已分配链表 private MemoryBlock usedMemory; public WorstFit(int blockNum) { } @Override public boolean allocate(int blockNum) { } MemoryBlock maxBlock = memList; if(maxBlock.getBlockNum()<blockNum) return false; super(blockNum); usedMemory = null; remove(maxBlock); if(maxBlock.getBlockNum()!=blockNum) { } insertUsed(maxBlock); return true; MemoryBlock newBlock = maxBlock.allocate(blockNum); insertUnused(newBlock);
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
}
return false;
}
@Override
public boolean free(int baseBlock) {
//已分配链表
MemoryBlock memBlock = usedMemory;
while(memBlock != null) {
if(memBlock.getBaseBlock() == baseBlock) {
freeMemory(memBlock);
merge(memBlock);
return true;
}
memBlock = memBlock.getNext();
}
return false;
}
public void removeUsed(MemoryBlock memBlock) {
if(memBlock == usedMemory)
usedMemory = memBlock.getNext();
if(memBlock.getNext()!=null)
memBlock.getNext().setPrev(memBlock.getPrev());
if(memBlock.getPrev()!=null)
memBlock.getPrev().setNext(memBlock.getNext());
}
void insertUnused(MemoryBlock newBlock) {
if(memList == null)
memList = newBlock;
else {
MemoryBlock memBlock = memList;
MemoryBlock preBlock = null;
while(memBlock!=null) {
if(newBlock.getBlockNum()>=memBlock.getBlockNum()) { insertBefore(memBlock, newBlock);
return;
}
preBlock = memBlock;
memBlock = memBlock.getNext();
}
insert(preBlock, newBlock);
}
}
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
} } 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(); if(usedMemory == null) } usedMemory = newBlock; MemoryBlock memBlock = usedMemory; while(memBlock.getNext() != null) memBlock = memBlock.getNext(); memBlock.setNext(newBlock); newBlock.setPrev(memBlock); else {
测试用例:
Main.java:
public class Main {
public static void testFirstFit() { MemoryTable mem = new FirstFit(1024); System.out.println("测试首次适应法:"); mem.allocate(512); mem.allocate(256); mem.allocate(128); mem.print(); mem.free(512);
public static void main(String[] args) { } testFirstFit(); System.out.println(); testBestFit(); System.out.println(); testWorstFit();
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告
}
} mem.print(); public static void testBestFit() { } public static void testWorstFit() { } MemoryTable mem = new WorstFit(1024); System.out.println("测试最坏适应法:"); mem.allocate(1); mem.allocate(2); mem.allocate(3); mem.print(); mem.free(0); mem.free(3); mem.print(); 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();
测试结果:
测试首次适应法:
分配 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. 释放内存时,根据不同的分配方法进行相邻的内存合并
3. 链表应根据具体情况优化从而简化代码
正在阅读:
天津理工大学 操作系统 存储器的分配与回收算法实现 实验报告09-03
黑客入侵方法和应对策略12-16
函证讨论案例及答案05-29
新人教版六上数学三疑三探教案1-309-29
2018年党委开展一支部一特色党建品牌创建活动实施方案05-21
被管虫的读后感【优秀4篇】03-28
2018继续教育《全面深化改革-推进国家文明发展1》试题及答案06-30
北语16秋《管理心理学》作业203-12
述职报告 (6)08-23
- exercise2
- 铅锌矿详查地质设计 - 图文
- 厨余垃圾、餐厨垃圾堆肥系统设计方案
- 陈明珠开题报告
- 化工原理精选例题
- 政府形象宣传册营销案例
- 小学一至三年级语文阅读专项练习题
- 2014.民诉 期末考试 复习题
- 巅峰智业 - 做好顶层设计对建设城市的重要意义
- (三起)冀教版三年级英语上册Unit4 Lesson24练习题及答案
- 2017年实心轮胎现状及发展趋势分析(目录)
- 基于GIS的农用地定级技术研究定稿
- 2017-2022年中国医疗保健市场调查与市场前景预测报告(目录) - 图文
- 作业
- OFDM技术仿真(MATLAB代码) - 图文
- Android工程师笔试题及答案
- 生命密码联合密码
- 空间地上权若干法律问题探究
- 江苏学业水平测试《机械基础》模拟试题
- 选课走班实施方案
- 天津
- 存储器
- 理工大学
- 算法
- 回收
- 分配
- 操作系统
- 实验
- 实现
- 报告
- 给水排水及采暖工程施工质量监理实施细则
- 银行理财产品市场报告(2013年28期)
- 马克思主义基本原理概论补充讲稿
- 三年级数学上册《万以内的加法和减法(二)》教学反思(1)
- 新版青岛版三年级下册数学第七单元《家居中的学问 小数的初步认识》教案(2018新版教材)
- 中国特色社会主义政治理论与实践
- 医学心理学自考复习要点
- 人教版新课标小学美术六年级上册全册教案2
- 双培养工作计划
- excel练习——成绩单
- 保险学期末考试试题及答案
- 北京市西城区2010-2011学年度高二年级第一学期期末试卷数学文科
- 微机原理及接口技术课程设计
- 天津理工大学操作系统实验2
- 高中语文基础知识试题.docx汇总
- 平行检验方案
- 药品包装盒材料的选择
- 七年级语文下册 春之韵——咏春古诗词赛诗会 苏教版
- 输变电工程业主项目部安全管理台帐
- 三星激光黑白打印机ML-3310ND纸盒有纸但不进纸,机器屏幕显示 MP纸盘缺纸 ,如何解决