内存的分配和回收分区链实验报告按照这个内容来完成文档格式.docx
- 文档编号:22012145
- 上传时间:2023-02-02
- 格式:DOCX
- 页数:21
- 大小:279.25KB
内存的分配和回收分区链实验报告按照这个内容来完成文档格式.docx
《内存的分配和回收分区链实验报告按照这个内容来完成文档格式.docx》由会员分享,可在线阅读,更多相关《内存的分配和回收分区链实验报告按照这个内容来完成文档格式.docx(21页珍藏版)》请在冰豆网上搜索。
分配空间的流程图
回收空间的流程图(见下页)
2.相关数据结构及关键函数说明
✧使用了structfree_table数据结构用来说明分区。
包含:
分区序号(num)、起始地址(address)、分区长度(length)和分区状态(state).
✧使用了线性表的双向链表存储结构(structNode),里面包含前驱指针(prior)和后继指针(next)。
一开始定义一条(含有first和end)的链,用开始指针和尾指针开创空间链表。
然后分别按三种算法进行分配和回收.
✧在该程序中关键函数有,sort()、allocation()、recovery()、和First_fit()、Best_fit()、Worst_fit()。
其中:
✧sort()函数用来整理分区序号。
如在删序号3时,它与前面序号2相连在一起了,然后序号2中的长度若满足申请的内存大小,就会在序号2中分配,然后序号在2的基础上加1,一直加,加到与原本序号3的下一个序号也就是4相等,这时sort()就开始有明显的工作了;
✧allocation()用来分配空间.也是过渡到三个算法中的,当三个算法中满足或者不满足分配请求,都会又返回值给allocation();
✧recovery()用来回收内存。
包含四种情况的处理,即释放区上与空闲区邻接、释放区下与空闲区邻接、释放区上下都与空闲区邻接、释放区上下都与空闲区不邻接.
实验参考代码如下:
#include〈stdio。
h〉
#include<
stdlib.h〉
#defineOK1//完成
#defineERROR0//出错
typedefintStatus;
typedefstructfree_table//定义一个空闲区说明表结构
{
intnum;
//分区序号
longaddress;
//起始地址
longlength;
//分区大小
intstate;
//分区状态
}ElemType;
typedefstructNode//线性表的双向链表存储结构
ElemTypedata;
structNode*prior;
//前趋指针
structNode*next;
//后继指针
}Node,*LinkList;
LinkListfirst;
//头结点
LinkListend;
//尾结点
intflag;
//记录要删除的分区序号
StatusInitblock()//开创带头结点的内存空间链表
{
first=(LinkList)malloc(sizeof(Node));
end=(LinkList)malloc(sizeof(Node));
first-〉prior=NULL;
first->
next=end;
end—〉prior=first;
end->
next=NULL;
end—〉data.num=1;
end—〉data。
address=40;
end-〉data。
length=600;
data。
state=0;
returnOK;
}
voidsort()//分区序号重新排序
{
Node*p=first->
next,*q;
q=p-〉next;
for(;
p!
=NULL;
p=p->
next)
{
for(q=p—>
next;
q;
q=q-〉next)
{
if(p->
data.num>
=q->
data.num)
{
q—〉data.num+=1;
}
}
//显示主存分配情况
voidshow()
{intflag=0;
//用来记录分区序号
Node*p=first;
p—>
num=0;
data.address=0;
p->
data.length=40;
p-〉data.state=1;
sort();
printf("
\n\t\t》主存空间分配情况《\n”);
**********************************************************\n\n"
);
分区序号\t起始地址\t分区大小\t分区状态\n\n"
while(p)
printf(”%d\t\t%d\t\t%d”,p->
num,p—〉data。
address,p—>
length);
if(p-〉data.state==0)printf(”\t\t空闲\n\n"
);
elseprintf(”\t\t已分配\n\n”);
p=p->
}
printf(”**********************************************************\n\n"
}
//首次适应算法
StatusFirst_fit(intrequest)
//为申请作业开辟新空间且初始化
Node*p=first->
LinkListtemp=(LinkList)malloc(sizeof(Node));
temp->
data.length=request;
temp—〉data.state=1;
data.num=1;
if((p-〉data.state==0)&
&(p—>
data.length==request))
{//有大小恰好合适的空闲块
data.state=1;
returnOK;
break;
elseif((p—〉data.state==0)&
&(p—>
data.length>
request))
{//有空闲块能满足需求且有剩余
temp-〉prior=p—〉prior;
temp—〉next=p;
temp—>
data.address=p—〉data。
address;
data.num=p->
num;
prior-〉next=temp;
prior=temp;
data.address=temp—〉data.address+temp—>
data.length;
p—〉data。
length-=request;
data.num+=1;
p=p—〉next;
returnERROR;
//最佳适应算法
StatusBest_fit(intrequest)
intch;
//记录最小剩余空间
Node*p=first;
Node*q=NULL;
//记录最佳插入位置
temp—〉data.length=request;
temp-〉data。
state=1;
p—〉data。
num=1;
while(p)//初始化最小空间和最佳位置
if((p—>
data.state==0)&
&
(p—>
=request))
if(q==NULL)
q=p;
ch=p—〉data。
length—request;
elseif(q-〉data。
length>
data.length)
q=p;
ch=p-〉data。
length-request;
p=p—〉next;
if(q==NULL)returnERROR;
//没有找到空闲块
elseif(q->
length==request)
q—〉data。
else
prior=q-〉prior;
temp—〉next=q;
address=q—>
data.address;
temp—〉data.num=q-〉data.num;
q—>
prior—〉next=temp;
q->
data.address+=request;
q-〉data.length=ch;
//最差适应算法
StatusWorst_fit(intrequest)
intch;
//记录最大剩余空间
next;
Node*q=NULL;
p—>
while(p)//初始化最大空间和最佳位置
if(p-〉data.state==0&
&(p—〉data。
length〉=request))
ch=p->
data.length-request;
data.length<
p-〉data.length)
data.length—request;
p=p-〉next;
elseif(q—>
data.length==request)
q—〉data。
length=1;
prior=q—>
prior;
next=q;
data.address=q—>
data.address;
data.num=q—〉data.num;
q—〉prior—>
next=temp;
q-〉data.address+=request;
data.length=ch;
q-〉data.num+=1;
//分配主存
Statusallocation(inta)
intrequest;
//申请内存大小
请输入申请分配的主存大小(单位:
KB):
"
scanf(”%d”,&
request);
if(request<
0||request==0)
分配大小不合适,请重试!
”);
switch(a)
case1:
//默认首次适应算法
if(First_fit(request)==OK)printf("
\t****分配成功!
****”);
elseprintf("
\t****内存不足,分配失败!
****”);
break;
case2:
//选择最佳适应算法
if(Best_fit(request)==OK)printf("
\t****分配成功!
****"
elseprintf(”\t****内存不足,分配失败!
****"
case3:
//选择最差适应算法
if(Worst_fit(request)==OK)printf("
\t****分配成功!
****"
\t****内存不足,分配失败!
Statusdeal1(Node*p)//处理回收空间
Node*q=first;
q!
q=q—>
if(q==p)
if(q->
prior-〉data。
state==0&
q—>
next—〉data.state!
=0)
q->
length+=q—>
data.length;
q-〉prior-〉next=q-〉next;
q—〉next-〉prior=q-〉prior;
q=q->
prior;
data.state=0;
num=flag-1;
if(q-〉prior—>
data.state!
=0&
&q->
next—>
state==0)
q-〉data.length+=q->
next->
length;
q—〉next=q—〉next—>
q-〉next—>
next-〉prior=q;
state=0;
num=flag;
if(q->
prior—>
state==0&&q->
data.state==0)
q—〉prior-〉data.length+=q—〉data。
length;
next=q—〉next;
q-〉next-〉prior=q—>
q=q—〉prior;
q—〉data.num=flag—1;
if(q—>
prior-〉data.state!
=0)
q—>
Statusdeal2(Node*p)//处理回收空间
Node*q=first;
q=q->
if(q-〉prior—>
data.state==0&
q—〉next—>
state!
q-〉prior—〉data。
length+=q—〉data.length;
q—〉prior—〉next=q->
q=p->
data.num=flag—1;
if(q—〉prior-〉data.state!
q—〉next->
q—〉next—〉data.state==0)
prior—〉data。
length+=q-〉data.length;
prior-〉next=q—>
q=q-〉prior;
data.state=0;
num=flag-1;
prior—〉data.state!
=0&&q-〉next->
state!
//主存回收
Statusrecovery(intflag)
Node*p=first;
for(;
p!
p=p-〉next)
num==flag)
{
if(p—>
prior==first)
{
next!
=end)//当前P指向的下一个不是最后一个时
if(p->
next-〉data.state==0)//与后面的空闲块相连
data.length+=p—〉next—>
next—〉next->
prior=p;
p-〉next=p->
p-〉data。
p-〉data.num=flag;
}
elsep—>
}
next==end)//当前P指向的下一个是最后一个时
}//结束if(p-〉prior==block_first)的情况
elseif(p—>
prior!
=first)
=end)
deal1(p);
else
deal2(p);
}//结束if(p—〉prior!
=block_first)的情况
}//结束if(p-〉data。
num==flag)的情况
\t****回收成功****"
//主函数
voidmain()
inti;
//操作选择标记
inta;
//算法选择标记
printf(”**********************************************************\n”);
printf(”\t\t用以下三种方法实现主存空间的分配\n"
\t
(1)首次适应算法\t
(2)最佳适应算法\t(3)最差适应算法\n”);
**********************************************************\n"
printf(”\n”);
printf(”请输入所使用的内存分配算法:
scanf("
%d"
&
a);
while(a〈1||a>
3)
输入错误,请重新输入所使用的内存分配算法:
\n”);
%d"
,&a);
case1:
printf(”\n\t****使用首次适应算法:
****\n"
break;
case2:
printf("
\n\t****使用最佳适应算法:
****\n”);
break;
case3:
\n\t****使用最坏适应算法:
****\n"
Initblock();
//开创空间表
while
(1)
show();
printf(”\t1:
分配内存\t2:
回收内存\t0:
退出\n”);
printf(”请输入您的操作:
,&
i);
if(i==1)
allocation(a);
//分配内存
elseif(i==2)//内存回收
请输入您要释放的分区号:
scanf(”%d"
,&flag);
recovery(flag);
elseif(i==0)
printf("
\n退出程序\n"
//退出
else//输入操作有误
输入有误,请重试!
continue;
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 内存 分配 回收 分区 实验 报告 按照 这个 内容 完成