首页 > 作文

动态分区

更新时间:2023-03-10 08:36:20 阅读: 评论:0

技术团队-向日葵简笔画图片

动态分区
2023年3月10日发(作者:当幸福来敲门主演)

实验四动态分区存储管理

实验目的:熟悉并掌握动态分区分配的各种算法。

熟悉并掌握动态分区中分区回收的各种情况,并能够实现分区合并。

实验内容:用高级语言模拟实现动态分区存储管理,要求:

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->addressaddress)

{

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->addressaddress)

{

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<address<length<

"<

p=p->next;

}

if(x>y)

{

cout<address<length<

配"<flag<

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 条评论)
   
验证码:
推荐文章
排行榜
Copyright ©2019-2022 Comsenz Inc.Powered by © 专利检索| 网站地图