c++模拟实现系统动态分区
前言
学校的实验内容,拿来写一篇文,希望有同样或类似内容需求的同学可以借鉴。
分析
用C语言实现首次适应算法的动态分区分配过程alloc()和回收过程free()。其中,空闲分区通过空闲区说明表; 在进行内存分配时,系统优先使用空闲区低端的空间。
/*动态分区的分配与回收演示程序*/
#include "stdio.h"
#define N 5
/*定义一个空闲区说明表结构,并初始化变量*/
struct freearea
{
int startaddress;/*空闲区始址*/
int size;/*空闲区大小*/
int state;/*空闲区状态:0为空表目,1为可用空闲块*/
}freeblock[N]={{20,20,1},{80,50,1},{150,100,1},{300,30,0},{600,100,1}};
/*定义为作业分配主存空间的函数alloc()*/
int alloc(int applyarea) /*applyarea为作业申请量*/
{
int i,tag=0; /*tag为检查是否有满足作业需要的空闲区的标志*/
for(i=0;i<N;i++) /*检查空闲区说明表是否有满足作业要求的空闲区*/
if(freeblock[i].state==1&&freeblock[i].size>applyarea)
{
freeblock[i].startaddress=freeblock[i].startaddress+applyarea;
freeblock[i].size=freeblock[i].size-applyarea;
tag=1; /*有满足条件的空闲区时,tag置1*/
return freeblock[i].startaddress-applyarea;
}
else
if(freeblock[i].state==1&&freeblock[i].size==applyarea)
{
freeblock[i].state=0;
tag=1; /*有满足条件的空闲区时,tag置1*/
return freeblock[i].startaddress; /*返回为作业分配的主存地址*/
}
if(tag==0)
return -1; /*没有满足条件的空闲区,分配不成功,返回-1*/
}
/*定义主存回收函数:setfree()
tag1代表释放区的高地址是否邻接一个空闲区,
tag2代表释放区的高低地址是否都邻接一个空闲区,
tag3代表释放区的低地址是否邻接一个空闲区*/
void setfree()
{
int s,l,tag1=0,tag2=0,tag3=0,i,j;
printf("input free area startaddress:\n");
scanf("%d",&s); /*输入释放区的开始地址*/
printf("input free area size:\n");
scanf("%d",&l); /*输入释放区的大小*/
for(i=0;i<N;i++)
{
if(freeblock[i].startaddress==s+l&&freeblock[i].state==1)
{
l=l+freeblock[i].size;
tag1=1; /*有与释放区高地址邻接的空闲区,tag1置1*/
for(j=0;j<N;j++)
if(freeblock[j].startaddress+freeblock[j].size==s&&freeblock[j].state==1)
{
freeblock[i].state=0;
freeblock[j].size=freeblock[j].size+l;
tag2=1;/*有与释放区上下都邻接的空闲区,tag2置1*/
break;
}
if(tag2==0) /*无与释放区高低地址邻接的空闲区*/
{
freeblock[i].startaddress=s;
freeblock[i].size=l;
break;
}
}
}
if(tag1==0) /*无与释放区高地址邻接的空闲区,并检查是否低地址有邻接空闲区*/
{
for(i=0;i<N;i++)
if(freeblock[i].startaddress+freeblock[i].size==s&&freeblock[i].state==1)
{
freeblock[i].size=freeblock[i].size+l;
tag3=1; /*有与释放区低地址邻接的空闲区*/
break;
}
if(tag3==0) /*无与释放区低地址邻接的空闲区*/
for(j=0;j<N;j++)
if(freeblock[j].state==0)/*找一个空表目,将释放区放入表中*/
{
freeblock[j].startaddress=s;
freeblock[j].size=l;
freeblock[j].state=1;
break;
}
}
}
/*定义对空闲区表中的空闲区调整的函数adjust(),
使空闲区按始地址从小到排列,空表目放在最后面*/
void adjust()
{
int i,j;
struct freearea middata;
for(i=0;i<N;i++) /*将空闲区按始地址顺序在表中排列*/
for(j=0;j<N;j++)
if(freeblock[j].startaddress>freeblock[j+1].startaddress)
{
middata.startaddress=freeblock[j].startaddress;
middata.size=freeblock[j].size;
middata.state=freeblock[j].state;
freeblock[j].startaddress=freeblock[j+1].startaddress;
freeblock[j].size=freeblock[j+1].size;
freeblock[j].state=freeblock[j+1].state;
freeblock[j+1].startaddress=middata.startaddress;
freeblock[j+1].size=middata.size;
freeblock[j+1].state=middata.state;
}
for(i=0;i<N;i++) /*将空表目放在表后面*/
for(j=0;j<N;j++)
if(freeblock[j].state==0&&freeblock[j+1].state==1)
{
middata.startaddress=freeblock[j].startaddress;
middata.size=freeblock[j].size;
middata.state=freeblock[j].state;
freeblock[j].startaddress=freeblock[j+1].startaddress;
freeblock[j].size=freeblock[j+1].size;
freeblock[j].state=freeblock[j+1].state;
freeblock[j+1].startaddress=middata.startaddress;
freeblock[j+1].size=middata.size;
freeblock[j+1].state=middata.state;
}
}
/*定义打印空闲区说明表函数:print()*/
void print()
{
int i;
printf(" |---------------------------------------------------------------|\n");
printf(" | start size state |\n");
printf(" |---------------------------------------------------------------|\n");
for(i=0;i<N;i++)
{
printf(" | %3d %3d %3d |\n",
freeblock[i].startaddress,freeblock[i].size,freeblock[i].state);
printf(" |---------------------------------------------------------------|\n");
}
}
/*主函数*/
int main()
{
int applyarea,start,i,j;
char end;
printf("\n is there any job request memory? y or n:");
while((end=getchar())=='y')
{
printf("at first the free memory is this:\n");
adjust(); /*对空闲区表中的空闲区调整的函数*/
print(); /*打印空闲区表的初始状态*/
printf("input request memory size:");
scanf("%d",&applyarea);/*输入作业的申请量*/
start=alloc(applyarea);/*调用alloc()函数为作业分配空间,start为返回的始地址*/
adjust();
printf("after allocation,the free memory is this:\n");
print(); /*打印空闲区表*/
if(start==-1) /*alloc()分配不成功时,返回-1*/
printf("there is no fit memory,please wait\n");
else
printf("job's memory start address is:%d\n",start);
printf("job size is:%d\n",applyarea);
printf("job is running.\n");
printf("job is terminated.\n");
for(j=1;j<100000;j++);/*延迟时间*/
setfree(); /*主存回收函数*/
adjust(); /*调整空闲区说明表*/
print(); /*打印空闲区表函数*/
printf("is there any job that is waiting? y/n:");
end=getchar();/*是否有作业等待?有(Y)无(N)*/
}
return 0;
}