动态分区分配及回收算法实验报告Word文件下载.docx
《动态分区分配及回收算法实验报告Word文件下载.docx》由会员分享,可在线阅读,更多相关《动态分区分配及回收算法实验报告Word文件下载.docx(11页珍藏版)》请在冰豆网上搜索。
(4)回收分区既不与前一个分区邻接,也不与后一个分区邻接。
另外,最佳适应算法不需要考虑多个进程,而首次适应算法需要考虑多道程序的大小,所以前两个程序只需要输入一个进程的信息,后者因为考虑多个程序的原因,所以需要输入两个进程的信息。
三、实验步骤、数据记录及处理
1、算法流程
抽象数据类型的定义:
空闲分区结构体类型和结构体链表
typedefstructfreespace
{
intnum;
//分区号
intsize;
//分区大小
intaddress;
//分区首地址
statusstate;
//分区状态,FREE和BUSY
};
typedefstructnode
freespacedata;
node*head;
node*next;
}*Linklist;
主程序的流程以及各程序模块之间的层次(调用)关系:
主函数中先调用初始化函数,再调用菜单函数引导用户选择操作和相应的算法,用switch多选择结构来判断调用firstAlloc(),bestAlloc(),display()还是recycle()。
程序流程图:
2、运行结果分析:
首次适应算法:
分配结束后的空闲分区大小和起始地址与结果相同。
大小
起始地址
30K
150K
20K
280K
112K
400K
最佳适应算法:
42K
470K
90K
210K
XX工业大学实验报告
四、总结与体会
附录:
源代码
#include<
iostream>
stdlib.h>
usingnamespacestd;
#defineMAXSIZE512
enumstatus{FREE,BUSY};
//枚举类型
Linklistfirst,last;
voidinit()
first=newnode;
last=newnode;
first->
head=NULL;
next=last;
last->
head=first;
next=NULL;
data.address=0;
data.size=MAXSIZE;
data.num=0;
data.state=FREE;
}
voiddisplay()
cout<
<
"
****************主存分配情况****************"
<
endl;
node*p=first->
next;
while(p)
{
cout<
分区号:
"
;
if(p->
data.num==0)
{
cout<
空闲区"
起始地址:
p->
data.address<
终止地址:
data.address+p->
data.size<
分区大小:
p->
data.size<
KB"
状态:
空闲"
}
else
data.num;
data.address+p->
data.size
if(p->
data.state==FREE)
cout<
else
if(p->
data.state==BUSY)
cout<
占用"
p=p->
}
**********************************************"
endl<
intfirstAlloc()//首次分配
intnum,size;
请输入作业号和分配的主存大小KB:
cin>
>
num>
size;
Linklistlist=newnode;
list->
data.num=num;
data.size=size;
data.state=BUSY;
data.state==FREE&
&
data.size==size)//有大小刚好合适的空闲块
p->
display();
return1;
data.size>
size)//有大小比他大的空闲块
list->
head=p->
head;
next=p;
data.address=p->
data.address;
head->
next=list;
head=list;
data.address=list->
data.address+list->
data.size;
data.size-=size;
display();
return0;
intbestAlloc()//最佳分配
intmin_space=MAXSIZE;
node*q=NULL;
while(p)//找到最佳位置
if((p->
size||p->
data.size==size)&
data.state==FREE)
data.size-size<
min_space)
{
q=p;
min_space=p->
data.size-size;
}
if(q==NULL)
return0;
else
if(min_space==0)
q->
head=q->
head;
next=q;
data.address=q->
data.address+=size;
intrecycle()//碎片整理
请输入你要回收存的作业号:
num;
node*p=first;
data.num==num)
data.state==FREE)//与前一块空闲区相邻,则合并
p->
data.size+=p->
next=p->
next->
data.state==FREE)//与后一块空闲区相邻,则合并
head=p;
break;
return1;
voidmenu()
********************存分配系统********************"
1.首次适应算法分配存"
2.最佳适应算法分配存"
3.查看主存分配情况"
4.回收主存"
请选择:
voidmain()
init();
intchoose;
menu();
while
(1)
//menu();
cin>
choose;
switch(choose)
case1:
firstAlloc();
case2:
bestAlloc();
case3:
case4:
recycle();
default:
输入错误!