分页式管理实验报告 下载本文

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;