天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx

上传人:b****1 文档编号:14335971 上传时间:2023-06-22 格式:DOCX 页数:23 大小:24.82KB
下载 相关 举报
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第1页
第1页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第2页
第2页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第3页
第3页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第4页
第4页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第5页
第5页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第6页
第6页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第7页
第7页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第8页
第8页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第9页
第9页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第10页
第10页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第11页
第11页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第12页
第12页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第13页
第13页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第14页
第14页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第15页
第15页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第16页
第16页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第17页
第17页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第18页
第18页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第19页
第19页 / 共23页
天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx_第20页
第20页 / 共23页
亲,该文档总共23页,到这儿已超出免费预览范围,如果喜欢就下载吧!
下载资源
资源描述

天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx

《天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx》由会员分享,可在线阅读,更多相关《天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx(23页珍藏版)》请在冰点文库上搜索。

天津理工大学操作系统存储器的分配与回收算法实现实验报告.docx

天津理工大学操作系统存储器的分配与回收算法实现实验报告

实验报告

学院(系)名称:

计算机与通信工程学院

姓名

nasta

学号

http:

//nasta.tk

专业

计算机科学与技术

班级

2010级2班

实验项目

实验二:

存储器的分配与回收算法实现

课程名称

操作系统

课程代码

0668036

实验时间

2012年12月13日第7、8节

2012年12月17日第3、4节

2012年12月20日第7、8节

实验地点

软件实验室7-215

批改意见

成绩

 

教师签字:

实验内容:

1.模拟操作系统的主存分配,运用可变分区的存储管理算法设计主存分配和回收程序,并不实际启动装入作业。

2.采用最先适应法、最佳适应法、最坏适应法分配主存空间。

3.当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。

若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。

4.当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。

5.运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。

实验要求:

1.详细描述实验设计思想、程序结构及各模块设计思路;

2.详细描述程序所用数据结构及算法;

3.明确给出测试用例和实验结果;

4.为增加程序可读性,在程序中进行适当注释说明;

5.认真进行实验总结,包括:

设计中遇到的问题、解决方法与收获等;

6.实验报告撰写要求结构清晰、描述准确逻辑性强;

7.实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。

【实验过程记录(源程序、测试用例、测试结果及心得体会等)】

源程序:

MemoryBlock.java:

//内存块类,包含各种操作

publicclassMemoryBlock{

staticfinalintBLOCK_SIZE=4096;

privateintbaseBlock;//内存块基地址

privateintblockNum;//大小

privatebooleaninUse;//是否已分配

privateMemoryBlockprev,next;

publicMemoryBlock(intblockNum){

this.baseBlock=0;

this.blockNum=blockNum;

inUse=false;

prev=null;

next=null;

}

publicMemoryBlock(intbase,intblockNum){

this.baseBlock=base;

this.blockNum=blockNum;

inUse=false;

prev=null;

next=null;

}

publicintgetBlockNum(){

returnblockNum;

}

publicvoidsetBlockNum(intblockNum){

this.blockNum=blockNum;

}

publicMemoryBlockgetPrev(){

returnprev;

}

publicvoidsetPrev(MemoryBlockprev){

this.prev=prev;

}

publicMemoryBlockgetNext(){

returnnext;

}

publicvoidsetNext(MemoryBlocknext){

this.next=next;

}

publicbooleaninUse(){

returninUse;

}

publicvoidsetUse(){

inUse=true;

}

publicvoidfree(){

inUse=false;

}

publicintgetBaseBlock(){

returnbaseBlock;

}

publicvoidsetBaseBlock(intbaseBlock){

this.baseBlock=baseBlock;

}

//分配内存块,如果可分配,则返回剩余内存块

publicMemoryBlockallocate(intblockNum){

if(this.blockNum-blockNum>0){

intnewBase=baseBlock+blockNum;

intnewBlock=this.blockNum-blockNum;

this.blockNum=blockNum;

setUse();

returnnewMemoryBlock(newBase,newBlock);

}

elseif(this.blockNum-blockNum==0){

this.blockNum=0;

}

returnnull;

}

 

//判断内存块是否能合并

publicbooleanmerge(MemoryBlockmemBlock){

if(baseBlock+blockNum==memBlock.getBaseBlock()){

setBlockNum(blockNum+memBlock.blockNum);

memBlock.setBaseBlock(0);

memBlock.setBlockNum(0);

returntrue;

}

else

returnfalse;

}

@Override

publicStringtoString(){

StringinUse=null;

if(inUse())inUse="已分配";

elseinUse="未分配";

return"内存块[基地址="+baseBlock+",大小="+blockNum+

","+inUse+"]";

}

}

MemoryTable.java:

//虚类MemTable,提供内存链表的各种基本方法

publicabstractclassMemoryTable{

//MemoryBlock链表表头

protectedMemoryBlockmemList;

publicMemoryTable(intblockNum){

memList=newMemoryBlock(0,blockNum);

}

//把newBlock插入到memBlock前面

publicvoidinsertBefore(MemoryBlockmemBlock,MemoryBlocknewBlock){

if(memBlock.getPrev()!

=null)

memBlock.getPrev().setNext(newBlock);

if(memList==memBlock)

memList=newBlock;

newBlock.setPrev(memBlock.getPrev());

newBlock.setNext(memBlock);

memBlock.setPrev(newBlock);

}

 

//在memBlock后插入newBlock

publicvoidinsert(MemoryBlockmemBlock,MemoryBlocknewBlock){

if(memBlock.getNext()!

=null)

memBlock.getNext().setPrev(newBlock);

newBlock.setNext(memBlock.getNext());

memBlock.setNext(newBlock);

newBlock.setPrev(memBlock);

}

//删除块的连接关系,但不释放块

publicvoidremove(MemoryBlockmemBlock){

if(memBlock==memList)

memList=memBlock.getNext();

if(memBlock.getNext()!

=null)

memBlock.getNext().setPrev(memBlock.getPrev());

if(memBlock.getPrev()!

=null)

memBlock.getPrev().setNext(memBlock.getNext());

}

publicvoidprint(){

MemoryBlockmemBlock=memList;

inti=0;

while(memBlock!

=null){

System.out.print(i+"");

System.out.println(memBlock);

i++;

memBlock=memBlock.getNext();

}

}

//合并邻接的空闲内存

publicvoidmerge(MemoryBlocknewBlock){

MemoryBlockmemBlock=memList;

while(memBlock!

=null){

if(!

memBlock.inUse()){

if(memBlock.merge(newBlock)){

memBlock.setBlockNum(memBlock.getBlockNum()+newBlock.getBlockNum());

remove(newBlock);

break;

}

if(newBlock.merge(memBlock)){

newBlock.setBlockNum(newBlock.getBlockNum()+memBlock.getBlockNum());

remove(memBlock);

break;

}

}

memBlock=memBlock.getNext();

}

}

//分配内存(抽象函数)

publicabstractbooleanallocate(intblockNum);

//释放内存(抽象函数)

publicabstractbooleanfree(intbaseBlock);

}

FirstFit.java:

publicclassFirstFitextendsMemoryTable{

publicFirstFit(intblockNum){

super(blockNum);

}

@Override

publicbooleanallocate(intblockNum){

MemoryBlockmemBlock=memList;

while(memBlock!

=null){

if(!

memBlock.inUse()){

if(memBlock.getBlockNum()>blockNum){

MemoryBlocknewBlock=memBlock.allocate(blockNum);

insert(memBlock,newBlock);

returntrue;

}

elseif(memBlock.getBlockNum()==blockNum){

memBlock.setUse();

}

}

memBlock=memBlock.getNext();

}

returnfalse;

}

//分配内存(类内使用)

voidfreeMemory(MemoryBlockfreeBlock){

MemoryBlockprev=freeBlock.getPrev();

MemoryBlocknext=freeBlock.getNext();

freeBlock.free();

if(freeBlock.getPrev()!

=null){

while(!

prev.inUse()&&(prev.merge(freeBlock))){

prev.setBlockNum(prev.getBlockNum()+freeBlock.getBlockNum());

remove(freeBlock);

freeBlock=prev;

if(freeBlock.getPrev()!

=null)

prev=freeBlock.getPrev();

elsereturn;

}

}

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();

elsereturn;

}

}

}

@Override

publicbooleanfree(intbaseBlock){

MemoryBlockmemBlock=memList;

while(memBlock!

=null){

if(memBlock.getBaseBlock()==baseBlock){

freeMemory(memBlock);

returntrue;

}

memBlock=memBlock.getNext();

}

returnfalse;

}

}

BestFit.java:

publicclassBestFitextendsMemoryTable{

privateMemoryBlockusedMemory;

publicBestFit(intblockNum){

super(blockNum);

usedMemory=null;

}

@Override

publicbooleanallocate(intblockNum){

MemoryBlockmemBlock=memList;

MemoryBlockminBlock=null;

for(;memBlock!

=null;memBlock=memBlock.getNext()){

if(!

memBlock.inUse()&&(memBlock.getBlockNum()>=blockNum)){

minBlock=memBlock;

break;

}

}

if(minBlock!

=null){

remove(minBlock);

if(minBlock.getBlockNum()!

=blockNum){

MemoryBlocknewBlock=minBlock.allocate(blockNum);

insertUnused(newBlock);

}

insertUsed(minBlock);

returntrue;

}

else

returnfalse;

}

booleanfreeMemory(MemoryBlockfreeBlock){

if(freeBlock!

=null){

freeBlock.free();

removeUsed(freeBlock);

insertUnused(freeBlock);

returntrue;

}

returnfalse;

}

@Override

publicbooleanfree(intbaseBlock){

MemoryBlockmemBlock=usedMemory;

while(memBlock!

=null){

if(memBlock.getBaseBlock()==baseBlock){

freeMemory(memBlock);

merge(memBlock);

returntrue;

}

memBlock=memBlock.getNext();

}

returnfalse;

}

//在已分配链表删除

publicvoidremoveUsed(MemoryBlockmemBlock){

if(memBlock==usedMemory)

usedMemory=memBlock.getNext();

if(memBlock.getNext()!

=null)

memBlock.getNext().setPrev(memBlock.getPrev());

if(memBlock.getPrev()!

=null)

memBlock.getPrev().setNext(memBlock.getNext());

}

//插入未分配链表

voidinsertUnused(MemoryBlocknewBlock){

if(memList==null)

memList=newBlock;

else{

MemoryBlockmemBlock=memList;

MemoryBlockpreBlock=null;

while(memBlock!

=null){

if(newBlock.getBlockNum()<=memBlock.getBlockNum()){

insertBefore(memBlock,newBlock);

return;

}

preBlock=memBlock;

memBlock=memBlock.getNext();

}

insert(preBlock,newBlock);

}

}

//插入已分配链表

voidinsertUsed(MemoryBlocknewBlock){

if(usedMemory==null)

usedMemory=newBlock;

else{

MemoryBlockmemBlock=usedMemory;

while(memBlock.getNext()!

=null)

memBlock=memBlock.getNext();

memBlock.setNext(newBlock);

newBlock.setPrev(memBlock);

}

}

publicvoidprint(){

super.print();

MemoryBlockmemBlock=usedMemory;

inti=0;

while(memBlock!

=null){

System.out.print(i+"");

System.out.println(memBlock);

i++;

memBlock=memBlock.getNext();

}

}

}

WorstFit.java:

publicclassWorstFitextendsMemoryTable{

//已分配链表

privateMemoryBlockusedMemory;

publicWorstFit(intblockNum){

super(blockNum);

usedMemory=null;

}

@Override

publicbooleanallocate(intblockNum){

MemoryBlockmaxBlock=memList;

if(maxBlock.getBlockNum()

returnfalse;

remove(maxBlock);

if(maxBlock.getBlockNum()!

=blockNum){

MemoryBlocknewBlock=maxBlock.allocate(blockNum);

insertUnused(newBlock);

}

insertUsed(maxBlock);

returntrue;

}

booleanfreeMemory(MemoryBlockfreeBlock){

if(freeBlock!

=null){

freeBlock.free();

removeUsed(freeBlock);

insertUnused(freeBlock);

returntrue;

}

returnfalse;

}

@Override

publicbooleanfree(intbaseBlock){

//已分配链表

MemoryBlockmemBlock=usedMemory;

while(memBlock!

=null){

if(memBlock.getBaseBlock()==baseBlock){

freeMemory(memBlock);

merge(memBlock);

returntrue;

}

memBlock=memBlock.getNext();

}

returnf

展开阅读全文
相关资源
猜你喜欢
相关搜索
资源标签

当前位置:首页 > 表格模板 > 合同协议

copyright@ 2008-2023 冰点文库 网站版权所有

经营许可证编号:鄂ICP备19020893号-2