动态分区管理实验报告
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
实验五动态分区管理模拟实验报告
关键问题:写一动态分区管理程序,使其内存分配采用最优适应分配算法。
设计思路:在空闲分区链中找最适合的空闲块,使内存碎片尽量的减少!根据最佳适应算法原理,在内存分配函数ffallocation()中,增加记录适合空白块的标记sp,然后拿当前空白块fp减去后jl的后的大小和它后面的另一空白块sp减去jl的大小相比较。
如果前者大于后者,且后者的空白区大于jl的大小,则当前空白块为sp,否则继续往后比较,直到空闲分区链末尾!则当前空白块为最适合的空白块!然后就把当前空白块分配给作业。
其他部分的代码与实例相同!
实现的关键代码:
//------------------------------------------------------------------- //有两个链:空白块链及作业链.空白块链描述空白块,链首指针freep,初始为一大块空白块.
//作业链按从高址到低址的顺序链接,链首指针jobp
//为作业jn分配jl大小内存,起始地址为ja
void ffallocation(int jl,char jn[10],int* ja)
{
mat* jp=NULL;//作业链当前节点
mat* jp2=NULL;//新的作业节点
mat* jp1=NULL;//
freearea* fp=NULL;//当前空白块
//修改部分 freearea* sp;//记录适合的空白块
int i;
*ja=-1;
if (totalfree<jl) //剩余空间大小不能满足作业要求
return;
*ja=0;
fp=freep;//取空白块链首块,将顺着链寻找第一块满足作业要求的块。
sp=freep;
while (fp!=NULL)
{
if (fp->freesize<jl)
{
fp=fp->next;//当前空白块大小不满足要求
sp=sp->next;
}
else //将当前空白块分配给作业
{
/*当当前空白块fp与它的下一块空白块sp相比较,如果它减去jl后大于下一空白块sp减去jl,且下一空白块sp大于等于jl,则当前空白块为sp;否则sp继续往后查找,直到空闲块查找完毕,然后当前空闲块为所要查找的适合空闲块!*/
while(sp!=NULL)
{
if((fp->freesize-jl>sp->freesize-jl)&(sp->freesize>=jl))
{
fp=sp;
}
else
{
sp=sp->next;
}
}
// jobnumber++;
totalfree=totalfree-jl;
jp2=new mat;//申请一块作业节点空间
//在节点上登记为该作业分配的内存空间
// for (i=0;i<10;i++) (jp2->jobname)[i]=' ';
i=-1;
while(jn[++i])
(jp2->jobname)[i]=jn[i];
(jp2->jobname)[i]='\0';
jp2->joblength=jl;
jp2->jobaddress=fp->freeaddress;//登记该作业的起始地址
*ja=jp2->jobaddress;
//将节点jp2插入作业链jobp,按高址到低址的顺序。
if (jobp==NULL)
{ //插入链首
jp2->next=NULL;
jp2->back=NULL;
jobp=jp2;
}
else
{
jp=jobp;//取链首指针
while((jp!=NULL) && (jp2->jobaddress<jp->jobaddress))
{
jp1=jp;//jp1为jp的前一个节点
jp=jp->next;//继续搜索
}
//将jp2插入到jp1之后、jp之前
jp2->next=jp;
if (jp==NULL)
{ //插到链尾
jp2->back=jp1;
jp1->next=jp2;
}
else
{ //插在链中间
jp2->back=jp->back;
if (jp->back!=NULL)//jp不是首节点
jp1->next=jp2;
else
jobp=jp2;//jp是首节点
jp->back=jp2;
}
} //if (jobp==NULL)
//剩余空白块处理
if (fp->freesize-jl<min)//剩余空间小于最小量,碎片 { //抛弃碎片fp
if (fp->next!=NULL)
(fp->next)->back=fp->back;//fp非尾节点
if (fp->back!=NULL)
(fp->back)->next=fp->next;//fp非首节点
else
freep=fp->next;//fp为首节点
}
else
{ //登记余下空白块fp:节点链指针不变,调整块的大小及地址 fp->freesize=fp->freesize-jl;
fp->freeaddress=fp->freeaddress+jl;//分配空白块前半部分 }
return;
} //else //将当前空白块分配给作业
}// while (fp!=NULL)
}
//-------------------------------------------------------------------程序运行结果:
总结及进一步改善建议:
从这次实验中,我更加深入理解了动态分区管理中的最先适应算法,最佳适应算法等内存分配算法!更进一步深入了解了操作系统中各模块的运行机制!使我对操作系统的研究更深入,更加有动力,操作系统中的算法太美妙了!。