动态分区分配方式的模拟C语言代码和C代码.docx
- 文档编号:2171912
- 上传时间:2022-10-27
- 格式:DOCX
- 页数:24
- 大小:109.85KB
动态分区分配方式的模拟C语言代码和C代码.docx
《动态分区分配方式的模拟C语言代码和C代码.docx》由会员分享,可在线阅读,更多相关《动态分区分配方式的模拟C语言代码和C代码.docx(24页珍藏版)》请在冰豆网上搜索。
动态分区分配方式的模拟C语言代码和C代码
实验三使用动态分区分配方式的模拟
1、实验目的
了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解。
2、实验内容
(1)用C语言分别实现采用首次适应算法和最佳适应算法的动态分区分配过程alloc()和回收过程free()。
其中,空闲分区通过空闲分区链来管理:
在进行内存分配时,系统优先使用空闲区低端的空间。
(2)假设初始状态下,可用的内存空间为640KB,并有下列的请求序列:
•作业1申请130KB。
•作业2申请60KB。
•作业3申请100KB。
•作业2释放60KB。
•作业4申请200KB。
•作业3释放100KB。
•作业1释放130KB。
•作业5申请140KB。
•作业6申请60KB。
•作业7申请50KB。
•作业6释放60KB。
请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。
程序代码——C语言实现
#include
#include
structnode//空闲分区链结点的定义
{
node*before;
node*after;
intsize;
intaddress;
intstate;
};
nodeL;
structusenode
{
usenode*next;
intnum;
intadd;
intsize;
}U,*n;
voidInit()//空闲分区链的初始化
{
node*p;
p=(node*)malloc(sizeof(node));
p->before=&L;
p->after=NULL;
p->size=640;
p->address=0;
p->state=0;
L.after=p;
L.before=NULL;
L.size=0;
U.next=NULL;
n=&U;
}
node*search(inta)
{
node*p=L.after;
if(p==NULL)
{
printf("没有空闲的区域!
");
p=NULL;
returnp;
}
else
{
while(p!
=NULL&&a>p->size)
p=p->after;
if(p==NULL)
{
printf("没有找到合适的空闲空间!
");
p=NULL;
returnp;
}
else
returnp;
}
}
voidrecovery(inta,intb)//内存回收算法
{
node*c,*s,*r=L.after;
node*d=L.after,*e;
usenode*k=U.next,*h=&U;
while(k!
=NULL&&a!
=k->num)
{
h=k;
k=k->next;
}
if(k==NULL)
printf("没有找到这样的作业!
");
else
{
h->next=k->next;
if(h->next==NULL)
n=h;
}
while(r!
=NULL)//若回收得到的空闲块的前方有空闲块合并此空闲块
{
if(k->add==r->address+r->size)
{
r->size=r->size+k->size;
break;
}
else
r=r->after;
}
if(r==NULL)//若回收得到的空闲块的后面有空闲块合并此空闲块
{
r=L.after;
while(r!
=NULL)
{
if(k->add+k->size==r->address)
{
r->address=k->add;
r->size=r->size+k->size;
break;
}
else
r=r->after;
}
}
while(d!
=NULL)//保证空闲链表中没有相邻的空闲空间
{
if(d->after!
=NULL)
e=d->after;
else
break;
if(d->address+d->size==e->address)
{
d->after=e->after;
while(e->after!
=NULL)
e->after->before=d;
d->size=d->size+e->size;
free(e);
break;
}
else
d=d->after;
}
if(r==NULL)
{
r=L.after;
c=(node*)malloc(sizeof(node));
c->size=b;
c->address=k->add;
if(L.after==NULL)
{
c->after=L.after;
c->before=&L;
L.after=c;
}
else
{
r=L.after;
while(r!
=NULL)
{
if(r->address>c->address)
{
c->after=r;
c->before=r->before;
r->before->after=c;
r->before=c;
free(k);
return;
}
else
r=r->after;
}
}
}
free(k);
}
voidalloc(inta,intb)//分配内存算法
{
node*p,*q=L.after;
usenode*m;
p=search(b);
if(p==NULL)
return;
m=(usenode*)malloc(sizeof(usenode));//生成一个被占用链表的结点,并插入到该链表的尾部
m->add=p->address;
m->size=b;
m->num=a;
m->next=n->next;
n->next=m;
n=m;//保证n始终指向被占用链表的尾部,方便以后新生成结点的插入
if(p->size>b)//如果申请空间的大小小于找到空闲空间的大小的处理
{
p->size=p->size-b;
p->address=p->address+b;
}
else//如果申请空间的大小等于找到空闲空间的大小的处理
{
p->before->after=p->after;
if(p->after!
=NULL)
p->after->before=p->before;
free(p);
}
}
voidsort()//对空闲链表进行排序
{
intmax;
node*p,*q,*r,*s;
nodea;
p=L.after;
while(p!
=NULL)//让指针q指向链表的最后一个结点
{
q=p;
p=p->after;
}
if(L.after->after==NULL)
return;
else
{
while(p!
=q)
{
s=r=p=L.after;
max=r->size;
while(s!
=q->after)
{
if(s->size>max)
{
max=s->size;
r=s;
s=s->after;
}
else
s=s->after;
}
a.size=q->size;
a.address=q->address;
q->size=r->size;
q->address=r->address;
r->size=a.size;
r->address=a.address;
if(q->before->before==&L)
return;
else
q=q->before;
}
}
}
voidPrint()
{
node*p=L.after;
usenode*q=U.next;
inti=1;
printf("\n空闲区域列表:
\n");
printf("FREEIDaddresssize\n");
while(p!
=NULL)
{
printf("%-10d",i);
printf("%-10d",p->address);
printf("%d\n",p->size);
p=p->after;
i++;
}
if(q==NULL)
return;
else
{
printf("\n已分配区域列表:
\n");
printf("WORKIDaddresssize\n");
while(q!
=NULL)
{
printf("%-10d",q->num);
printf("%-10d",q->add);
printf("%d\n",q->size);
q=q->next;
}
}
}
voidfirstfit()//首次适应算法
{
inta,b,i;
Init();
Print();
while
(1)
{printf("\n1、申请空间\n");
printf("2、释放空间\n");
printf("3、退出首次适应算法\n");
printf("请输入你的选择:
");
scanf("%d",&i);
switch(i)
{
case1:
{
printf("请输入申请空间的作业号:
");
scanf("%d",&a);
printf("请输入申请空间的大小:
");
scanf("%d",&b);
alloc(a,b);
Print();
break;
}
case2:
{
printf("请输入释放空间的作业号:
");
scanf("%d",&a);
printf("请输入释放空间的大小:
");
scanf("%d",&b);
recovery(a,b);
Print();
break;
}
case3:
printf("\n");return;
}
}
}
voidbestfit()
{
inta,b,i;
Init();
Print();
while
(1)
{printf("\n1、申请空间\n");
printf("2、释放空间\n");
printf("3、退出最佳适应算法\n");
printf("请输入你的选择:
");
scanf("%d",&i);
switch(i)
{
case1:
{
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 动态 分区 分配 方式 模拟 语言 代码
![提示](https://static.bdocx.com/images/bang_tan.gif)