#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
if(freeblock[i].state1&&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].state1&&freeblock[i].sizeapplyarea)
{
freeblock[i].state=0;
tag=1; /有满足条件的空闲区时,tag置1/
return freeblock[i].startaddress; /返回为作业分配的主存地址/
}
if(tag0)
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/定义对空闲区表中的空闲区调整的函数adjust(),
使空闲区按始地址从小到排列,空表目放在最后面/
void adjust()
{
int i,j;
struct freearea middata;
for(i=0;i将空闲区按始地址顺序在表中排列/
for(j=0;jif(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将空表目放在表后面/
for(j=0;jif(freeblock[j].state0&&freeblock[j+1].state1)
{
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{
printf(" | %3d %3d %3d |n",
freeblock[i].startaddress,freeblock[i].size,freeblock[i].state);
printf(" |---------------------------------------------------------------|n");
}
}
/主函数/
void 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 waitn”);
else
printf(“job’s memory start address is:%dn”,start);
printf(“job size is:%dn”,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)/
}
}



