动态分区分配算法实验报告文档格式.docx
《动态分区分配算法实验报告文档格式.docx》由会员分享,可在线阅读,更多相关《动态分区分配算法实验报告文档格式.docx(17页珍藏版)》请在冰豆网上搜索。
![动态分区分配算法实验报告文档格式.docx](https://file1.bdocx.com/fileroot1/2023-1/4/86a8298a-2abb-48a0-a69b-cf0df119b088/86a8298a-2abb-48a0-a69b-cf0df119b0881.gif)
状态
第一栏
14K
12K
未分配
第二栏
32K
96K
其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。
(2)当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。
有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:
一部分分给作业占用;
另一部分又成为一个较小的空闲区。
为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。
为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。
(3)采用最先适应算法(顺序分配算法)分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。
当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。
(4)当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。
(5)请按最先适应算法设计主存分配和回收的程序。
假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:
作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,
作业4申请30K,作业5申请40K,作业6申请60K,作业4释放30K。
请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。
四、实验报告
(1)画出最先适应分配算法流程图、归还主存时的回收算法流程图。
最先适应分配算法流程图:
N
Y
归还主存时的回收算法流程图:
(2)程序中使用的数据结构及符号说明。
答:
本程序用c++语言编写,其中用到了class{}类、指针,利用指针将classTable{}(空闲表类)和classPro{}(作业类)用链式存储的方式进行插入、删除、新建、排序等工作。
(3)打印一份源程序并附上注释。
#include<
iostream.h>
string.h>
classPro//作业对象
{
public:
Pro(){
Size=0;
next=NULL;
Start=0;
Name[0]='
\0'
;
}
Pro(intSi,charNa[]){
Size=Si;
strcpy(Name,Na);
voidprintf()
{
cout<
<
Name<
"
\t"
Start<
endl;
voidArrange(intSta,Pro&
Ne)
Start=Sta;
next=&
Ne;
Pro*next;
//用来指向下一个输入的作业
intSize;
//作业大小
charName[10];
//作业名称
intStart;
//在内存中存放的起始地址
};
classTable//空闲表
Table*next;
//指向下一个空闲区块
intSize;
//空闲区块大小
Table(){
Table(intSta,intSiz)
Size=Siz;
Over=Sta+Siz;
intStart;
//空闲区块起始地址
intOver;
//空闲区块结束地址
voidPri(Pro*ph)
if(ph)
{
cout<
endl<
内存中的作业"
作业名"
起始地址"
for(Pro*p=ph;
p;
p=p->
next)
p->
printf();
}
else
cout<
作业已全部运行完毕!
}
voidPrik(Table*h)
if(h)
空闲区块分配情况"
空闲区块起始地址"
空闲区块大小"
for(;
h;
h=h->
h->
\t\t\t"
Size<
无空闲区块!
voidPX(Table*&
h,Table*p)//排序顺序空闲区块
Table*hp=h->
next;
Table*hf=h;
Table*hf2=h;
Table*hf1=h;
if(p->
Start==1000)
return;
for(;
hf1;
hf1=hf1->
next)//检查新增空闲区块是否是原空闲区块
if(hf1->
p->
Over&
&
hf1->
Start>
=p->
Start&
hf1==h)
h=h->
elseif(hf1->
Start)
{
hf2->
next=hf1->
}
hf2=hf1;
if(!
h)//检查有无空闲区块,当空闲区块是原空闲块时会去除重新分配
h=p;
if(h->
next==NULL)
next=h;
hp;
hp=hp->
if(p->
hp->
Size)
p->
next=hp;
hf->
next=p;
break;
}
hf=h;
hp)
hf->
voidZJKX(Table*&
h,Pro*p,Pro*pp)//空闲区块的改变
intpos=p->
Start+p->
Size,jugy=0;
Table*ph1=h;
for(Table*ph=h;
ph;
ph=ph->
if(ph->
Start==pos)
jugy=1;
Table*pph1=h;
Table*pph=h;
for(;
pph;
pph=pph->
next)
{
if(pph->
Over==p->
Start)//3
{
pph1->
next=pph->
ph1->
next=ph->
Table*n=newTable(pph->
Start,ph->
Size+pph->
Size+p->
Size);
PX(h,n);
break;
}
pph1=pph;
}
if(!
pph)//4
ph->
Size=ph->
Size;
Start=p->
Start;
PX(h,ph);
ph1=ph;
jugy)
Table*pph1=h;
for(Table*pph=h;
pph&
!
jugy;
for(Pro*pp1=pp;
pp1;
pp1=pp1->
if(p->
Start==(pp1->
Start+pp1->
Size))//2
{
for(Table*h2=h;
h2;
h2=h2->
if((p->
Size)==h2->
{
Table*n=newTable(p->
Start,p->
Size+h2->
PX(h,n);
jugy=1;
break;
}
if(!
Table*n=newTable(p->
jugy=1;
elseif((p->
Size)==pp1->
Start)//1
for(Table*h1=h;
h1;
h1=h->
if(h1->
Table*n=newTable(h1->
Size+h1->
Table*n=newTable(p->
PX(h,n);
jugy=1;
break;
pph1=pph;
next)//5
if(pph->
pph->
Size=pph->
Over=pph->
Over+p->
PX(h,pph);
break;
h)
Table*x=newTable(p->
h=x;
voidSF(Pro*&
ph,charN[],Table*&
h)//释放作业
intjugy=0;
Pro*pp=ph;
strcmp(ph->
Name,N))
ZJKX(h,ph,ph);
ph=ph->
jugy=1;
for(Pro*p=ph->
if(!
strcmp(N,p->
Name))//完成作业的删除:
删除作业对象+增加空闲区块对象,并检查是否可以合并
ZJKX(h,p,ph);
pp->
next=p->
pp=p;
队列中没有这个作业!
voidJR(Pro*&
ph,Pro*p,Table*&
h)//加入作业
//分割空闲区块
Table*hpp=h;
for(Table*hp=h;
if(p->
=hp->
p->
Start=hp->
Size==1000)
if(hpp==hp)
h=NULL;
else
hpp->
next=NULL;
jugy=1;
else
hp->
Size=hp->
Size-p->
break;
if(jugy)
ph)
ph=p;
pp->
pp=pp->
next)
;
//作业队列尾部插入新作业对象
pp->
没有足够的空间分配!
intmain()
这是一个采用最先适应算法(顺序分配算法)分配主存空间的小测试。
这里一共有1000kb内存可供使用,有三种选择:
1、载入一个作业"
2、释放一个作业"
<
0、结束测试"
intchoice;
Pro*ph=NULL;
Table*head=newTable(0,1000);
charNa[10];
intsize;
while
(1)
请输入你的选择:
cin>
>
choice;
if(choice==1)
请输入作业名以及作业大小:
cin>
Na>
size;
Pro*p=newPro(size,Na);
JR(ph,p,head);
Pri(ph);
Prik(head);
elseif(choice==2)
请输入作业名称:
Na;
SF(ph,Na,head);
elseif(!
choice)
exit(0);
return0;
(4)打印程序运行时的初值和运行结果,要求如下:
(5)如果在要申请一个100K的作业空间,能否满足?
答:
本程序初定内存总容量为1000K,所以可以满足;
当总容量小于500K时,无法申请。