ad=Free_table[k].address+Free_table[k].length; }
//修改已分配区表 i=0;
while(Used_Table[i].flag!=0&&i if(i>=n) //无表目填写已分分区 { printf(\无表目填写已分分区,错误\\n\//修正空闲区表 if(Free_table[k].flag==0) //前面找到的是整个空闲分区 Free_table[k].flag=1; else {//前面找到的是某个空闲分区的一部分 Free_table[k].length=Free_table[k].length+X_K; return; } } else {//修改已分配表 Used_Table[i].address=ad; Used_Table[i].length=X_K; Used_Table[i].flag=PRS_NAME; } return; }//内存分配函数结束 void reclaim(char PRS_NAME) //回收进程名为PRS_NAME的进程所占内存空间 { int i,k,j,s,t; float S,L; //寻找已分配表中对应登记项 s=0; while((Used_Table[s].flag!=PRS_NAME||Used_Table[s].flag==0)&&s if(s>=n)//在已分配表中找不到名字为PRS_NAME的进程 { cout<<\找不到该进程\return; } //修改已分配表 Used_Table[s].flag=0; //取得归还分区的起始地址S和长度L S=Used_Table[s].address; L=Used_Table[s].length; j=-1;k=-1;i=0; //寻找回收分区的空闲上下邻,上邻表目k,下邻表目j while(i if(Free_table[i].flag==1) { if(Free_table[i].address+Free_table[i].length==S)k=i;//找到上邻 if(Free_table[i].address==S+L)j=i;//找到下邻 } i++; } if(k!=-1) if(j!=-1) // 上邻空闲区,下邻空闲区,三项合并 { Free_table[k].length=Free_table[j].length+Free_table[k].length+L; Free_table[j].flag=1; } else //上邻空闲区,下邻非空闲区,与上邻合并 Free_table[k].length=Free_table[k].length+L; else if(j!=-1) //上邻非空闲区,下邻为空闲区,与下邻合并 { Free_table[j].address=S; Free_table[j].length=Free_table[j].length+L; } else //上下邻均为非空闲区,回收区域直接填入 { //在空闲区表中寻找空栏目 t=0; while(Free_table[t].flag==1&&t if(t>=m)//空闲区表满,回收空间失败,将已分配表复原 { cout<<\内存空闲表没有空间,回收空间失败\Used_Table[s].flag=j; return;