for(j=1;j<100000;j++);/*延迟时间*/ shifang(); /*主存回收函数*/
tiaozheng(); /*调整空闲区说明表*/ print(); /*打印空闲区表函数*/
printf(\ end=getchar();/*是否有作业等待?有(Y)无(N)*/ } }
int feipei(int zone,int s) /*zone为作业申请量*/ {
int i,tag=0; /*tag为检查是否有满足作业需要的空闲区的标志*/
for(i=s;i if(free[i].state==1&&free[i].size>zone) { free[i].startaddr=free[i].startaddr+zone; free[i].size=free[i].size-zone; tag=1; /*有满足条件的空闲区时,tag置1*/ start=free[i].startaddr-zone; return i; } else if(free[i].state==1&&free[i].size==zone) { free[i].state=0; tag=1; /*有满足条件的空闲区时,tag置1*/ start=free[i].startaddr; /*返回为作业分配的主存地址*/ return i; } if(tag==0) return -1; /*没有满足条件的空闲区,分配不成功,返回-1*/ } void shifang() { int s,l,tag1=0,tag2=0,tag3=0,i,j; printf(\ scanf(\ /*输入释放区的开始地址*/ printf(\ scanf(\ /*输入释放区的大小*/ for(i=0;i { if(free[i].startaddr==s+l&&free[i].state==1) { l=l+free[i].size; tag1=1; /*有与释放区高地址邻接的空闲区,tag1置1*/ for(j=0;j if(free[j].startaddr+free[j].size==s&&free[j].state==1) { free[i].state=0; free[j].size=free[j].size+l; tag2=1;/*有与释放区上下都邻接的空闲区,tag2置1*/ break; } if(tag2==0) /*无与释放区高低地址邻接的空闲区*/ { free[i].startaddr=s; free[i].size=l; break; } } } if(tag1==0) /*无与释放区高地址邻接的空闲区,并检查是否低地址有邻接空闲区*/ { for(i=0;i if(free[i].startaddr+free[i].size==s&&free[i].state==1) { free[i].size=free[i].size+l; tag3=1; /*有与释放区低地址邻接的空闲区*/ break; } if(tag3==0) /*无与释放区低地址邻接的空闲区*/ for(j=0;j if(free[j].state==0)/*找一个空表目,将释放区放入表中*/ { free[j].startaddr=s; free[j].size=l; free[j].state=1; break; } } } /*定义对空闲区表中的空闲区调整的函数tiaozheng(), 使空闲区按始地址从小到大排列,空表目放在最后面*/ void tiaozheng() { int i,j; struct area middata; for(i=0;i if(free[j].startaddr>free[j+1].startaddr) { middata.startaddr=free[j].startaddr;middata.size=free[j].size; middata.state=free[j].state;free[j].startaddr=free[j+1].startaddr; free[j].size=free[j+1].size;free[j].state=free[j+1].state; free[j+1].startaddr=middata.startaddr; free[j+1].size=middata.size; free[j+1].state=middata.state; } for(i=0;i if(free[j].state==0&&free[j+1].state==1) { middata.startaddr=free[j].startaddr;middata.size=free[j].size; middata.state=free[j].state; free[j].startaddr=free[j+1].startaddr; free[j].size=free[j+1].size; free[j].state=free[j+1].state; free[j+1].startaddr=middata.startaddr;free[j+1].size=middata.size; free[j+1].state=middata.state; } } /*定义打印空闲区说明表函数:print()*/ void print() { int i; printf(\ |---------------------------------------------------------------|\\n\ printf(\| start size state |\\n\ printf(\ |---------------------------------------------------------------|\\n\ for(i=0;i printf(\| = = = |\\n\ free[i].startaddr,free[i].size,free[i].state); printf(\ |---------------------------------------------------------------|\\n\ } }