还剩6页未读,继续阅读
文本内容:
存储管理上机作业——最佳适应算法以最佳适应为例,给出可变式分区的分配回收算法源程序如下#includestdio.h#defineN5structfreearea{intstartaddress;intsize;intstate;}freeblock[N]={{20201}{80301}{160101}{200400}{250501}};intallocateintapplyarea{intitag=0;fori=0;iN;i++{iffreeblock[i].sizeapplyareafreeblock[i].state==1{freeblock[i].startaddress=freeblock[i].startaddress+applyarea;freeblock[i].size=freeblock[i].size-applyarea;tag=1;//有满足条件的分区时,tag置1returnfreeblock[i].startaddress-applyarea;}elseiffreeblock[i].size==applyareafreeblock[i].state==1{freeblock[i].state=0;tag=1;//有满足条件的分区时,tag置1returnfreeblock[i].startaddress;}}iftag==0return-1;}voidset_free{intijsltag1=0tag2=0tag3=0;printfpleaseinputthestartaddressyouwanttosetfree:\n;scanf%ds;printfpleaseinputthesize:\n;scanf%dl;fori=0;iN;i++{iffreeblock[i].startaddress+freeblock[i].size==sfreeblock[i].state==1//释放区与某一空闲块的高地址相邻接{l=freeblock[i].size+l;tag1=1;//释放区与某一空闲块的高地址相邻接forj=0;jN;j++//内层循环用于检测释放区是否同时与两个空闲块相邻接{iffreeblock[j].startaddress==freeblock[i].startaddress+lfreeblock[j].state==1{freeblock[j].size=l+freeblock[j].size;freeblock[j].startaddress=freeblock[i].startaddress;freeblock[i].state=0;tag2=1;//标记同时与两个空闲块相接break;}}iftag2==0{freeblock[i].startaddress=s;freeblock[i].size=l;break;}}}//foriftag1==0//不与空闲块的高地址相接{fori=0;iN;i++//检测是否与某空闲块的低地址相接{ifs+l==freeblock[i].startaddressfreeblock[i].state==1{freeblock[i].startaddress=s;freeblock[i].size=freeblock[i].size+l;tag3=1;break;}iftag3==0//不与任何空闲块相接{forj=0;jN;j++{iffreeblock[j].state==0{freeblock[j].startaddress=s;freeblock[j].size=l;freeblock[j].state=1;break;}}}}}}voidadjust{intij;structfreeareatemp;fori=0;iN;i++{forj=i;jN;j++{iffreeblock[i].sizefreeblock[j].size{temp.size=freeblock[i].size;temp.startaddress=freeblock[i].startaddress;temp.state=freeblock[i].state;freeblock[i].size=freeblock[j].size;freeblock[i].startaddress=freeblock[j].startaddress;freeblock[i].state=freeblock[j].state;freeblock[j].size=temp.size;freeblock[j].startaddress=temp.startaddress;freeblock[j].state=temp.state;}}}fori=0;iN;i++{iffreeblock[i].state==0freeblock[i+1].state==1{temp.size=freeblock[i].size;temp.startaddress=freeblock[i].startaddress;temp.state=freeblock[i].state;freeblock[i].size=freeblock[i+1].size;freeblock[i].startaddress=freeblock[i+1].startaddress;freeblock[i].state=freeblock[i+1].state;freeblock[i+1].size=temp.size;freeblock[i+1].startaddress=temp.startaddress;freeblock[i+1].state=temp.state;}}}voidprint{inti;printf%5s%15s%13s%12sblock_idstart_addresssizestate;printf\n;fori=0;iN;i++printf%5d%15d%15d%10d\nifreeblock[i].startaddressfreeblock[i].sizefreeblock[i].state;}voidmain{intstart;intchoice;intapplyarea;while1{printf********************************\n;printf1:Iwanttorequestformemory.\n;printf2:Iwanttosetfreesomememory.\n;printf3:exit.\n;printfPleaseinputyourchoice:\n;printf********************************\n;scanf%dchoice;ifchoice==1{printfAtfirstthefreememorytableis:\n;print;printfPleaseinputtherequestmemorysize:\n;scanf%dapplyarea;adjust;start=allocateapplyarea;ifstart==-1{printfThereisnotenoughmemorypleasewait.\n;}else{printfYourrequestisbeingsubmitted.jobsizeis:%d\napplyarea;printfjobisrunning.jobsstartaddressis:%d\nstart;printfAfterallocationthememorytableis:\n;adjust;print;}}ifchoice==2{set_free;printfAftersetfreethememorytableis:\n;adjust;print;}ifchoice==3break;}}进入程序主界面如下测试用例如下当输入选择1时,进入内存请求界面,并且显示现在的空闲块分布情况如下(state为零标记该空闲内存块不可用)输入请求的内存空间大小(例如大小为5)由最佳适应算法把起始地址为160,大小为5的内存分配给请求进程,分配后的内存表如上图,同时返回程序的主界面;输入选择为2时,提示输入将要释放区间的起始地址与大小,举例输入将要释放的区间起始地址为110,大小为20,将释放的空闲区与已有的空闲区合并,内存分配表如下图继续输入选择为2,输入要释放的区间起始地址为180,大小为15,释放之后的内存分配表如下图输入选择为2,释放区间起始地址为60,大小为20,释放之后的内存分配表如下此时输入选择为1,请求的内存空间大小为10,分配后的内存如分配表如下此时输入3,程序结束退出。