实验四动态分区存储管理
实验目的:熟悉并掌握动态分区分配的各种算法。
熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。
实验内容:用高级语言模拟实现动态分区存储管理,要求:
1、分区分配算法至少实现首次适应算法、最佳适应算法和最坏适应算法中的至
少一种。熟悉并掌握各种算法的空闲区组织方式。
2、分区的初始化——可以由用户输入初始分区的大小。(初始化后只有一个空
闲分区,起始地址为0,大小是用户输入的大小)
3、分区的动态分配过程:由用户输入作业号和作业的大小,实现分区过程。
4、分区的回收:用户输入作业号,实现分区回收,同时,分区的合并要体现出
来。(注意:不存在的作业号要给出错误提示!)
5、分区的显示:任何时刻,可以查看当前内存的情况(起始地址是什么,大小
多大的分区时空闲的,或者占用的,能够显示出来)
6、要求考虑:(1)内存空间不足的情况,要有相应的显示;
(2)作业不能同名,但是删除后可以再用这个名字;
(3)作业空间回收是输入作业名,回收相应的空间,如果这个作
业名不存在,也要有相应的提示。
#include"iostream.h"
#include"iomanip.h"
#defineERR_NOFREEAREA1
#defineERR_NOADEQUACYAREA2
#defineERR_ALLOCATED4
#defineERR_NOJOBS1
#defineERR_NOSUCHJOB2
#defineERR_RECLAIMED4
typedefstructtagUdNode
{
longaddress;
longlength;
intflag;//作业名
structtagUdNode*next;
}
USED_AREA,*USED_TABLE;
typedefstructtagFreeNode
{
longaddress;
longlength;
structtagFreeNode*next;
}
FREE_AREA,*FREE_TABLE;
//空闲区、作业区链表
USED_TABLEudTable=NULL;
FREE_TABLEfreeTable=NULL;
//给作业分配空间
intAllocate(intjobname,longjobsize)
{
//如果没有空闲区
if(freeTable==NULL)
returnERR_NOFREEAREA;
FREE_TABLEp=freeTable;
FREE_TABLEq=p;
//找首次适应空闲区
while(p!=NULL&&p->length
{
q=p;
p=p->next;
}
//如果找不到有足够空间的分区
if(p==NULL)
returnERR_NOADEQUACYAREA;
USED_TABLEx=newUSED_AREA;
x->address=p->address;
x->length=jobsize;
x->flag=jobname;
x->next=NULL;
//如果该分区大于作业需求,空间大小减去作业大小
if(p->length>jobsize)
{
p->length-=jobsize;
p->address+=jobsize;
}
//如果该分区等于作业大小,删除该分区
el
{
if(p==freeTable)
freeTable=NULL;
el
q->next=p->next;
deletep;
}
//作业加入"作业表"中
USED_TABLEr=udTable;
USED_TABLEt=r;
while(r!=NULL&&r->address
{
t=r;
r=r->next;
}
if(udTable==NULL)
udTable=x;
el
{
x->next=r;
t->next=x;
}
returnERR_ALLOCATED;
}
//回收作业空间
intReclaim(intjobname)
{
if(udTable==NULL)
returnERR_NOJOBS;
USED_TABLEp=udTable;
USED_TABLEq=p;
while(p!=NULL&&p->flag!=jobname)
{
q=p;
p=p->next;
}
//如果没有该作业
if(p==NULL)
returnERR_NOSUCHJOB;
//回收后的空间加入到空闲区
FREE_TABLEr=freeTable;
FREE_TABLEt=r;
FREE_TABLEx;
while(r!=NULL&&r->address
{
t=r;
r=r->next;
}
x=newFREE_AREA;
x->address=p->address;
x->length=p->length;
x->next=NULL;
if(r==freeTable)
{
x->next=r;
freeTable=x;
t=freeTable;
}
el
{
x->next=r;
t->next=x;
}
//合并分区
while(t->next!=NULL&&t->address+t->length==t->next->address)
{
t->length+=t->next->length;
r=t->next;
t->next=t->next->next;
deleter;
}
//删除作业
if(p==udTable)
{
udTable=udTable->next;
}
el
q->next=p->next;
deletep;
returnERR_RECLAIMED;
}
intInit()
{
freeTable=newFREE_AREA;
freeTable->address=0;
freeTable->length=1024;
freeTable->next=NULL;
return1;
}
voidjobrequest()
{
intjobname;
intjobsize;
cout<<"n************************"<
cout<<"作业名:";
cin>>jobname;
cout<<"作业长度:";
cin>>jobsize;
if(Allocate(jobname,jobsize)==ERR_ALLOCATED)
cout<<"该作业已成功获得所需空间"<
el
cout<<"该作业没有获得所需空间"<
cout<<"************************n"<
}
voidjobreclaim()
{
intjobname;
cout<<"n************************"<
cout<<"作业名:";
cin>>jobname;
intresult=Reclaim(jobname);
if(result==ERR_RECLAIMED)
cout<<"该作业已成功回收"<
elif(result==ERR_NOSUCHJOB||result==ERR_NOJOBS)
cout<<"该作业不存在,请重新输入"<
cout<<"************************n"<
}
voidfreeTablePrint()
{
cout<<"n*****************************************"<
cout<
"<
FREE_TABLEp=freeTable;
USED_TABLEq=udTable;
intx,y;
while(p||q)
{
if(p)
x=p->address;
el
x=0x7fffffff;
if(q)
y=q->address;
el
y=0x7fffffff;
if(x
{
cout<
"<
p=p->next;
}
if(x>y)
{
cout<
配"<
q=q->next;
}
}
cout<<"*****************************************n"<
}
voidmain()
{
Init();
intchoo;
boolexitFlag=fal;
while(!exitFlag)
{
cout<<"-----------------------输入选择项-----------------------"<
cout<<"------1分配分区2回收分区3显示分区4退出
------"<
cout<<"--------------------------------------------------------n"<
cout<<"选择:";
cin>>choo;
switch(choo)
{
break;
ca1:
jobrequest();
break;
ca2:
jobreclaim();
break;
ca3:
freeTablePrint();
break;
ca4:
exitFlag=true;
}
}
}
本文发布于:2023-03-10 08:36:19,感谢您对本站的认可!
本文链接:https://www.wtabcd.cn/fanwen/zuowen/1678408580202328.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文word下载地址:动态分区.doc
本文 PDF 下载地址:动态分区.pdf
留言与评论(共有 0 条评论) |