动态分区分配方式的模拟.docx

上传人:b****6 文档编号:3553246 上传时间:2022-11-23 格式:DOCX 页数:27 大小:1.12MB
下载 相关 举报
动态分区分配方式的模拟.docx_第1页
第1页 / 共27页
动态分区分配方式的模拟.docx_第2页
第2页 / 共27页
动态分区分配方式的模拟.docx_第3页
第3页 / 共27页
动态分区分配方式的模拟.docx_第4页
第4页 / 共27页
动态分区分配方式的模拟.docx_第5页
第5页 / 共27页
点击查看更多>>
下载资源
资源描述

动态分区分配方式的模拟.docx

《动态分区分配方式的模拟.docx》由会员分享,可在线阅读,更多相关《动态分区分配方式的模拟.docx(27页珍藏版)》请在冰豆网上搜索。

动态分区分配方式的模拟.docx

动态分区分配方式的模拟

实验三使用动态分区分配方式的模拟

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。

请分别采用首次适应算法和最佳适应算法,对内存块进行分配和回收,要求每次分配和回收后显示出空闲分区链的情况。

3、程序代码

#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:

{

printf("请输入申请空间的作业号:

");

scanf("%d",&a);

printf("请输入申请空间的大小:

");

scanf("%d",&b);

alloc(a,b);

sort();

Print();

break;

}

case2:

{

printf("请输入释放空间的作业号:

");

scanf("%d",&a);

printf("请输入释放空间的大小:

");

scanf("%d",&b);

recovery(a,b);

sort();

Print();

break;

}

case3:

printf("\n");return;

}

}

}

voidmain()

{

inti;

while

(1)

{

printf("1、首次适应算法\n");

printf("2、最佳适应算法\n");

printf("3、退出\n");

printf("请输入你的选择:

");

scanf("%d",&i);

switch(i)

{

case1:

firstfit();break;

case2:

bestfit();break;

case3:

return;

}

}

}

4、运行结果

①开始界面

②首次适应算法

 

进入首次适应算法:

作业1申请130KB的空间:

作业2申请60KB的空间:

作业3申请100KB的空间

作业2释放60KB的空间

作业4申请200KB的空间:

作业3释放100KB的空间:

作业1释放130KB的空间:

作业5申请140KB的空间:

作业6申请60KB的空间:

作业7申请50KB的空间:

作业6释放60KB的空间:

退出首次适应算法:

③最佳适应算法

最佳适应算法的开始界面:

作业1申请130KB的空间:

作业2申请60KB的空间:

作业3申请100KB的空间:

作业2释放60KB的空间:

作业4申请200KB的空间:

作业3释放100KB的空间:

作业1释放130KB的空间:

作业5申请140KB的空间:

作业6申请60KB的空间:

作业7申请50KB的空间:

作业6释放60KB的空间:

退出最佳适应算法:

展开阅读全文
相关资源
猜你喜欢
相关搜索

当前位置:首页 > 考试认证 > 从业资格考试

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1