最坏适应算法动态分区法存储.docx
- 文档编号:2264721
- 上传时间:2022-10-28
- 格式:DOCX
- 页数:9
- 大小:16.09KB
最坏适应算法动态分区法存储.docx
《最坏适应算法动态分区法存储.docx》由会员分享,可在线阅读,更多相关《最坏适应算法动态分区法存储.docx(9页珍藏版)》请在冰豆网上搜索。
最坏适应算法动态分区法存储
阅读教材《计算机操作系统》第四章,掌握存储器管理相关概念和原理。
编写程序模拟实现内存的动态分区法存储管理。
内存空闲区使用自由链管理,采用最坏适应算法从自由链中寻找空闲区进行分配,内存回收时假定不做与相邻空闲区的合并。
假定系统的内存共640K,初始状态为操作系统本身占用64K。
在t1时间之后,有作业A、B、C、D分别请求8K、16K、64K、124K的内存空间;在t2时间之后,作业C完成;在t3时间之后,作业E请求50K的内存空间;在t4时间之后,作业D完成。
要求编程序分别输出t1、t2、t3、t4时刻内存的空闲区的状态。
实验代码带界面系统
#include
#include
typedefstructlist{
intlen;
charname;
intaddress;
structlist*next;
}listNode,*listlink;
charid='1';
voidinit(listlink&q){
q=(listlink)malloc(sizeof(listNode));
if(!
q)exit(-1);
q->next=NULL;
}//初始化
intlength(listlinkfree){
listlinkq;
q=free->next;
intlen=0;
while(q!
=NULL){
len=len+q->len;
q=q->next;
}
returnlen;
}//空闲区总长度
listlinkDelist(charname,listlink&q){
listlinka,b,c;
a=q->next;
b=q;
while(a!
=NULL){
if(a->name==name){
c=a->next;
b->next=c;
returna;
}
b=b->next;
a=a->next;
}
returnNULL;
}//按作业或进程名删除该结点
voidinsert(listlink&q,intaddress,intlen,charname='F'){
listlinka=(listlink)malloc(sizeof(listNode));
a->address=address;
a->len=len;
a->name=name;
listlinkb=q;
while(b->next!
=NULL){
b=b->next;
}
a->next=NULL;
b->next=a;
}//插入结点
voidsort(listlink&q){
listlinka,b;
inttemp1,temp2;
a=q->next;
if(a==NULL)
return;
b=a->next;
while(a->next!
=NULL){
while(b!
=NULL){
if(a->len<=b->len){
temp1=a->address;
temp2=a->len;
a->len=b->len;
a->address=b->address;
b->address=temp1;
b->len=temp2;
}
b=b->next;
}
a=a->next;
b=a->next;
}
}//按长度从大到小排序
listlinkfindpre(listlinkfree,intaddress){
listlinka;
a=free->next;
while(a!
=NULL){
if(a->address+a->len==address){
Delist(a->name,free);
returna;
}
a=a->next;
}
returnNULL;
}//查找前连接区
listlinkfindnext(listlinkfree,intaddress,intlen){
listlinka;
a=free->next;
while(a!
=NULL){
if(a->address==address+len){
Delist(a->name,free);
returna;
}
a=a->next;
}
returnNULL;
}//查找后连接区
voidfreeMemo(charname,listlink&free,listlink&busy){
listlinka=Delist(name,busy);
listlinkb,c;
id++;
b=findpre(free,a->address);
c=findnext(free,a->address,a->len);
if(b!
=NULL&&c!
=NULL){
b->len=a->len+b->len+c->len;
insert(free,b->address,b->len,id);
sort(free);
}//前连接区后连接区都存在
elseif(b==NULL&&c!
=NULL){
a->len=a->len+c->len;
insert(free,a->address,a->len,id);
sort(free);
}//前连接区不存在后连接区存在
elseif(b!
=NULL&&c==NULL){
b->len=a->len+b->len;
insert(free,b->address,b->len,id);
sort(free);
}//前连接区存在后连接区不存在
else{
insert(free,a->address,a->len,id);
}//前连接区不存在后连接区不存在
}//回收内存
voidrequireMemo(charname,intrequire,listlink&free,listlink&busy){
listlinka;
intaddress;
a=free->next;
if(a!
=NULL&&a->len>=require){
a->len=a->len-require;
if(a->len==0){
address=a->address;
Delist(a->name,free);
}
else{
address=a->address;
a->address=a->address+require;
sort(free);
}
insert(busy,address,require,name);
}
else
printf("分配失败\n");
}//内存分配
voidvisit(listlinkfree){
listlinka;
inti=1;
a=free->next;
printf("空闲区的情况\n");
if(a==NULL)
printf("空\n");
while(a!
=NULL){
printf("空闲区%d起始地址:
%d长度:
%d\n",i,a->address,a->len);
a=a->next;
i++;
}
}//输出空闲区链表情况
voidvisit1(listlinkbusy){
listlinka;
inti=1;
a=busy->next;
printf("繁忙区的情况\n");
if(a==NULL)
printf("空\n");
while(a!
=NULL){
printf("繁忙区%d起始地址:
%d长度:
%d进程名:
%c\n",i,a->address,a->len,a->name);
a=a->next;
i++;
}
}//输出繁忙区链表情况
voidshow(listlinkfree,listlinkbusy){
printf("可变分区存储管理系统\n");
printf("\n");
charchoice='1';
charname;
intrequire;
while(choice!
='0'){
printf("----------------------------------------\n");
printf("|1:
查看空闲区总长度|\n");
printf("|2:
请求内存分配|\n");
printf("|3:
回收内存|\n");
printf("|4:
查看空闲区状态|\n");
printf("|5:
查看繁忙区状态|\n");
printf("|0:
退出|\n");
printf("----------------------------------------\n");
printf("请输入你要执行的操作选项(0-5):
");
scanf("\n%c",&choice);
switch(choice){
case'0':
{
printf("谢谢使用本系统,欢迎下次使用\n");
break;
}
case'1':
{
printf("空闲区总长度:
%d\n",length(free));
break;
}
case'2':
{
printf("请输入作业或进程名:
");
scanf("\n%c",&name);
printf("请输入作业或进程所需内存大小:
");
scanf("%d",&require);
requireMemo(name,require,free,busy);
break;
}
case'3':
{
printf("请输入需回收的作业或进程名:
");
scanf("\n%c",&name);
freeMemo(name,free,busy);
break;
}
case'4':
visit(free);
break;
case'5':
{
visit1(busy);
break;
}
default:
break;
}
printf("\n");
}
}//界面系统
voidmain(){
listlinkfree;
listlinkbusy;
init(free);
init(busy);
insert(free,0,640,id);
requireMemo('S',64,free,busy);
show(free,busy);
}
- 配套讲稿:
如PPT文件的首页显示word图标,表示该PPT已包含配套word讲稿。双击word图标可打开word文档。
- 特殊限制:
部分文档作品中含有的国旗、国徽等图片,仅作为作品整体效果示例展示,禁止商用。设计者仅对作品中独创性部分享有著作权。
- 关 键 词:
- 最坏 适应 算法 动态 分区 存储