存储管理.docx
《存储管理.docx》由会员分享,可在线阅读,更多相关《存储管理.docx(23页珍藏版)》请在冰豆网上搜索。
存储管理
存储管理实验报告
一、实验要求:
1.设计一个空闲区说明表和一个主存空间占用(已分配区)情况表,作为主存当前使用的基础,并初始化空闲区和已分配区说明表。
2.采用最佳适应算法分配为主存空间
注意:
按照作业的需要量,查空闲去说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。
当空闲区大于所需空间时,对该空闲区进行分割,一部分用来装入作业,另一部分仍为空闲区,登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存去分配给作业后并不实际启动装入程序装入作业,而是用输出“分配情况”来模拟。
二、
实验流程图:
否
否
是是
否是
最佳适应算法分配模拟算法
三、实验源代码:
#include
#include
#include
#definegetjcb(type)(type*)malloc(sizeof(type))
#definegetsub(type)(type*)malloc(sizeof(type))
intnum,num2;//要调度的作业数和要回收的区域数
intm=0,k=5;//m已分配作业数,k空闲分区数
intflag;//分配成功标志
intisup,isdown;//回收区域存在上邻和下邻
intis=0;
structjcb{//内存块数据结构
charname[10];
charstate;
intntime;//所需时间
intsize;//所需空间大小
intaddr;//所分配分区的首地址
structjcb*link;
}*ready=NULL,*p,*q,*as=NULL;//作业队列ready,已分配作业队列as,p在sort()input()中作中间变量,q在sort3()中作中间变量
typedefstructjcbJCB;
structsubarea{//分区块数据结构
charname[10];
intaddr;//分区首地址
intsize;//分区大小
charstate;
structsubarea*link;
}*sub=NULL,*r,*s,*cur;//空闲分区队列sub,当前分区指针cur
typedefstructsubareaSUB;
voidsort()//建立对作业按到达时间进行排列的函数,直接插在队列之尾
{
JCB*first;//建立指针first
if(ready==NULL)//若队空,将p直接赋给ready
ready=p;
else{//若队不空
first=ready;//ready赋给first
while(first->link!
=NULL)//如果first不在队尾,则后移(因为每次进入sort()函数都会重新建立first,所以必须让它移动到队尾,否则出错)
first=first->link;
first->link=p;//将p连接到队列中
p->link=NULL;//p->link置NULL以免内存混乱
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
voidsort2()//最佳适应算法分区块排序算法(冒泡排序)
{
SUB*temp,*mm,*n;
for(inti=0;i{
mm=sub;//从分区开头两个块开始比较进行排序
n=sub->link;
for(intj=k-i;j>0;j--)//根据可用分区块确定循环次数
{
if((mm->size)>(n->size))//如果前面的分区块比后面的大,进入进行交换
{
temp=sub;//temp记录进行比较的两个区块之前的一个区块用于交换后将分区连接起来
while((temp->link!
=mm)&&(temp!
=mm))//确保temp移动到mm前面
temp=temp->link;
temp->link=n;//重新排序
mm->link=n->link;
n->link=mm;
}
else//如果前面的分区块<=后面的分区块,mm后移
mm=mm->link;
n=mm->link;//n指向mm下一个分区块
}
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
voidsort3()//建立对已分配作业队列的排列函数,直接插在队列之尾
{
JCB*fir;//建立指针fir
if(as==NULL)//若队空,将p直接赋给ready
as=q;
else{//若队不空
fir=as;//as赋给fir
while(fir->link!
=NULL)//如果fir不在队尾,则后移(因为每次进入sort3()函数都会重新建立fir,所以必须让它移动到队尾,否则出错)
fir=fir->link;
fir->link=q;//将p连接到队列中
q->link=NULL;//q->link置NULL以免内存混乱
}
m++;//已分配作业数加一
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
voidinput()//建立作业控制块函数
{
inti;
printf("\n请输入要调度的总作业数:
");//用户输入作业总数
scanf("%d",&num);
for(i=0;i{
printf("\n作业号N0.%d:
\n",i);
p=getjcb(JCB);
printf("\n请输入作业名:
");
scanf("%s",&p->name);
printf("\n请输入作业大小:
");
scanf("%d",&p->size);
printf("\n输入作业所需运行时间:
");
scanf("%d",&p->ntime);
p->state='W';
p->link=NULL;
sort();//作业排序
}
printf("按任意键继续...\n");
getchar();//吃掉用户输入后按下的“Enter”
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
voidinput2()//建立要回收区域的函数
{
JCB*k;
inthas;//定义has作为是否有作业回收的标志
q=getjcb(JCB);
printf("\n输入区域名(作业名):
");//输入要回收的作业名
scanf("%s",&q->name);
p=as;
while(p!
=NULL)
{
if(strcmp(p->name,q->name)==0)//在已分配作业队列中寻找
{
q->addr=p->addr;
q->size=p->size;
has=1;//输入作业名存在标志
if(p==as)//在已分配作业队列中删除该作业
as=p->link;
else
{
k=as;
while(k->link!
=p)
k=k->link;
k->link=k->link->link;//删除
}
printf("输出该作业的首地址:
%d\n",q->addr);
printf("输出该作业大小:
%d\n",q->size);
q->link=NULL;
break;
}
else
{
p=p->link;//输入作业名不存在标志
has=0;
}
}
if(has==0)
{
printf("\n输入作业名错误!
请重新输入!
\n");
input2();
}
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
voidprint()
{
printf("\n\n\n\n");
printf("\t\t*********************************\n");
printf("\t\t\t三.存储实验管理演示\n");
printf("\t\t*********************************\n");
printf("\n\n\n\t\t\t信息学院自动化1003\n");
printf("\t\t\t姓名:
祁永胜\n");
printf("\t\t\t学号:
201003120319\n");
printf("\t\t\t完成时间:
2012年10月10日\n\n\n\n");
printf("\t\t\t\t\t请按下任意键进入演示:
");
printf("\n\n\n");
getchar();
system("cls");
}
//+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
voidinit_sub()//初始化空闲分区表
{
r=getsub(SUB);
strcpy(r->name,"0");
r->addr=5;
r->size=10;
r->state='n';
sub=r;
s=getsub(SUB);
strcpy(s->name,"1");
s->addr=20;
s->size=120;
s->state='n';
sub->link=s;
r=s;
s=getsub(SUB);
strcpy(s->name,"2");
s->addr=160;
s->size=40;
s->state='n';
r->link=s;
r=s;
s=getsub(SUB);
strcpy(s->name,"3");
s->addr=220;
s->size=10;
s->state='n';
r->link=s;
r=s;
s=getsub(SUB);
strcpy(s->name,"4");
s->addr=250;
s->size=20