实验2存储器的分配与回收Word格式.docx
《实验2存储器的分配与回收Word格式.docx》由会员分享,可在线阅读,更多相关《实验2存储器的分配与回收Word格式.docx(36页珍藏版)》请在冰豆网上搜索。
2.采用最先适应法、最佳适应法、最坏适应法分配主存空间。
3.当一个新作业要求装入主存时,必须查空闲区表,从中找出一个足够大的空闲区。
若找到的空闲区大于作业需要量,这是应把它分成二部分,一部分为占用区,加一部分又成为一个空闲区。
4.当一个作业撤离时,归还的区域如果与其他空闲区相邻,则应合并成一个较大的空闲区,登在空闲区表中。
5.运行所设计的程序,输出有关数据结构表项的变化和内存的当前状态。
实验要求:
1.详细描述实验设计思想、程序结构及各模块设计思路;
2.详细描述程序所用数据结构及算法;
3.明确给出测试用例和实验结果;
4.为增加程序可读性,在程序中进行适当注释说明;
5.认真进行实验总结,包括:
设计中遇到的问题、解决方法与收获等;
6.实验报告撰写要求结构清晰、描述准确逻辑性强;
7.实验过程中,同学之间可以进行讨论互相提高,但绝对禁止抄袭。
【实验过程记录(源程序、测试用例、测试结果及心得体会等)】
#include<
iostream>
usingnamespacestd;
typedefstructRamtable//内存表结构体
{
intuse;
//是否被占用,=0未被占用,=1被占用
}Ramtable;
typedefstructFreeRamtable//空闲地址登记表结构体
intFreeRamSize;
//空闲占用内存大小
intFreeStartAdd;
//空闲起始地址
intFreeEndAdd;
//空闲结束地址
intFreeNumber;
//按照顺序的空闲分区编号(由地址的从前到后)
}FreeRamtable;
typedefstructUsedRamtable//已分配区地址登记表结构体
intUsedRamSize;
//已分配区地址占用大小
intUsedStartAdd;
//已分配区起始地址
intUsedEndAdd;
//已分配区结束地址
intUsedNumber;
//按照作业占用的内存起始地址顺序的排序编号
stringWorkName;
//作业名称
}UsedRamtable;
RamtableRam[100]={0};
//内存表
FreeRamtableFreeRam[51];
//空闲地址登记表
UsedRamtableUsedRam[100];
//已分配区地址登记表
intWorkNumber=0;
//当前作业数注意:
全局变量只能计算一次,再次计算需先置零
intFreeWorkNumber=0;
//当前空闲区数注意:
全局变量只能计算一次,再次计算需先置零
intChoose;
//选择三种算法的一种
stringname;
//作业的名字
intWorkSize;
//作业所占内存大小
voidCountWorkNumber()//计算当前作业数
for(inti=0;
i<
100;
i++)
{
if(UsedRam[i].WorkName=="
"
)
break;
else
WorkNumber++;
}
}
voidCountFreeWorkNumber()
51;
if(FreeRam[i].FreeStartAdd!
=-1)
FreeWorkNumber++;
voidInitWorkName()//初始化已分配内存登记表的第一个记录,使其名字为空,方便计算
UsedRam[0].WorkName="
;
FreeRam[0].FreeRamSize=100;
FreeRam[0].FreeStartAdd=0;
FreeRam[0].FreeEndAdd=99;
FreeRam[1].FreeStartAdd=-1;
voidGetWork()
cout<
<
PleaseEnterWork`snameandramsize:
cin>
>
name>
WorkSize;
Enter1usingQuickarithmetic"
endl;
Enter2usingBestarithmetic"
Enter3usingWorstarithmetic:
"
Choose;
intQuick()//最先适应算法
inti;
for(i=0;
if(FreeRam[i].FreeRamSize>
=WorkSize)
if(i==51)
cout<
ERROR!
NoEnoughFreeRamLefe!
return-1;
//找不到合适的空间时返回-1,方便进行下一步操作
returni;
//返回值是指示第几个空闲区的下标
intBest()//最佳适应算法
inttemp=-1;
{
if(temp<
0)
temp=i;
else
{
if(FreeRam[temp].FreeRamSize>
FreeRam[i].FreeRamSize)
temp=i;
}
}
if(temp<
returntemp;
intWorst()//最坏适应算法
if(FreeRam[temp].FreeRamSize<
voidMoldification()
WorkNumber=0;
CountWorkNumber();
WorkNumber;
for(intj=UsedRam[i].UsedStartAdd;
j<
=UsedRam[i].UsedEndAdd;
j++)
Ram[j].use=1;
voidInsert()
intk;
//找到要插入的作业的所在已分配表中的位置
FreeWorkNumber=0;
//计算此时的作业数
CountFreeWorkNumber();
//计算此时的空闲区数
if(Choose==1)
i=Quick();
for(intj=0;
if(WorkNumber!
=0)
{//这种情况可能会使k=0,在第一个作业的开始地址比较靠后,且前面是空闲分区
if(UsedRam[j].WorkName=="
{//这个没有登记作业
k=j;
break;
}
elseif(FreeRam[i].FreeEndAdd<
UsedRam[j].UsedStartAdd)
{//已经登记作业,但是需要在此处插入
k=0;
break;
if(k!
if(UsedRam[k].WorkName!
="
)//这个格子已经登记过其他作业
{//即不是数组最后的空的格子
for(intj=WorkNumber;
j>
k;
j--)
{
UsedRam[j].UsedRamSize=UsedRam[j-1].UsedRamSize;
UsedRam[j].UsedStartAdd=UsedRam[j-1].UsedStartAdd;
UsedRam[j].UsedEndAdd=UsedRam[j-1].UsedEndAdd;
UsedRam[j].WorkName=UsedRam[j-1].WorkName;
UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;
UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;
UsedRam[k].UsedRamSize=WorkSize;
UsedRam[k].WorkName=name;
UsedRam[WorkNumber+1].WorkName="
if(FreeRam[i].FreeRamSize>
WorkSize)
FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;
FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;
else
for(intj=i;
FreeWorkNumber-1;
{
FreeRam[j].FreeRamSize=FreeRam[j+1].FreeRamSize;
FreeRam[j].FreeStartAdd=FreeRam[j+1].FreeStartAdd;
FreeRam[j].FreeEndAdd=FreeRam[j+1].FreeEndAdd;
}
FreeRam[FreeWorkNumber-1].FreeStartAdd=-1;
else//这个格子还没有登记
{//即是数组中最后空白中的第一个格子
UsedRam[k+1].WorkName="
else//k=0时有两种情况,一种是没有作业,另一种是:
{//第一个作业的开始地址之前是空闲分区,且大小比插入作业大小大
if(WorkNumber==0)
0;
}
intx;
x=1;
elseif(Choose==2)
i=Best();
if(UsedRam[j].UsedStartAdd==0&
&
UsedRam[j].UsedEndAdd==0)
if(UsedRam[k].UsedStartAdd!
UsedRam[k].UsedStartAdd=FreeRam[i].FreeStartAdd;
UsedRam[k].UsedEndAdd=FreeRam[i].FreeStartAdd+WorkSize-1;
UsedRam[k].UsedRamSize=WorkSize;
UsedRam[k].WorkName=name;
if(FreeRam[i].FreeRamSize>
FreeRam[i].FreeStartAdd=UsedRam[k].UsedEndAdd+1;
FreeRam[i].FreeRamSize=FreeRam[i].FreeEndAdd-FreeRam[i].FreeStartAdd+1;
for(intj=i;