《实验三 存储器管理.docx》由会员分享,可在线阅读,更多相关《实验三 存储器管理.docx(7页珍藏版)》请在优知文库上搜索。
1、实验三存储器管理一、实验目的1 .了解内存管理的基本功能2 .掌握内存管理中的几种内存分配与回收算法3 .掌握可变分区算法中空闲分区的合并方法二、实验内容与要求设计一个存储器管理模拟系统并调试运行。要求采用一种常用的存储器分配算法(如:最正确适应算法、最坏适应算法),设计一个存储器管理模拟系统。允许进展屡次的分配和释放,并可向用户反响分配和释放情况及当前内存的情况;采用“命令菜单选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。三、实验参考下面是采用的是首次适应分配算法的一个例如。根据指针freep查找自由链,当找到第一块可满足分配请求的空闲区
2、时便分配之。当某空闲区被分配后的剩余空闲区空间大于规定的碎片最小容量min时,那么形成一个较小的空闲区留在自由链中。回收时,根据MAT将指定分区链入自由链。假设该分区有前邻或后邻空闲分区,那么将他们拼接成一块加大的空闲区。当某个分配请求不能被满足,但此时系统中所有碎片总量满足分配请求的容量时,系统立即进入内存“紧凑以消除碎片。即将各作业占用区集中下移到用户内存区的下部(高地址局部),形成一片连接的作业区,而在用户内存区的上部形成一块较大的空闲区。然后再进展分配。本系统的主要程序模块包括:分配模块ffallocation,回收模块ffcolection,紧凑模块coalesce及命令处理模块me
3、nu。Menu用以模拟系统的输入,采用“命令菜单选择和键盘命令输入的会话方式,根据输入请求调用分配模块,或回收模块,或内存查询模块,或最终退出系统。用到的数据构造如下:(1)自由链与区头。内存空闲区采用自由链构造。链首由freep指向,链中各个空闲区按地址递增次序排列。初启时整个用户内存区为一个空闲区。在每个空闲区首部设置一个区头(freearca)构造。区头信息包括:size空闲区大小(以字节计),包括区头所占空间;next前向链指针,指向下一个空闲区;back反向链指针,指向上一个空闲区;address本空闲区首地址。(2)内存分配表MAT0系统设置一个MAT,每个运行作业都在MAT中占有
4、一个表目,回收分区时去除相应表目。表目信息包括:name用户作业名;length作业区大小;addr作业区首地址;例如代码#include#include初始化#defineTOTA1.5000#defineSETADDRES#defineMIN1001-#defineMAX10现实命令菜单typedefstructfreearea(intaddress;intsize;读命令显示不能分配showyoureturn(U);/*分配模块*读键盘fngpei(intjl,charjn)freeptrfp;endjobptrjp,jpl,jp2;jp2=(jobptr)malloc(si:if(to
5、talfreesizenext;else(jobnumber=jobnumber+1;totalfree=totalfree-jl;jp2-name=jn;jp2-length=jl;jp2-address=freep-address;if(jobp=NU1.1.)(jp2-next=NU1.1.;jp2-back=NU1.1.;jobp=jp2;)elsejp=jobp;while(jp!=NU1.1.&(jp2-addressaddress)(jpi=jp;jp=jp-next;)jp2-next=jp;if(jp=NU1.1.)(jp2-back=jpl;jpl-nextjp2;)els
6、ejp2-back=jp-back;if(jp-back!=NU1.1.)jpl-next=jp2;elsejobp=jp2;jp-back=Jp2;)if(fp-size-jl)next!=NU1.1.)fp-next-back=fp-back;if(fp-back!=NU1.1.)fp-back-next=fp-next;elsefreep=fp-next;*return();*/)elsefp-size=fp-size-jl;fp-address=fp-address+jl;return(2);if(totalfree=jl)retum(0);/*显示模块*/xianshi()jbptr
7、jp;/*清屏*/if(jobnumbername,jp-length,jp-address);jp=jp-next;)printf(11nthetotalleftis%dbytes:,totalfree);)/*回收模块*/huishou(charjn)(freeptrfp,fpl,fp2;jobptrjp;intf=0;jp=jobp;while(jp!=NU1.1.)&(jp-name!=Jn)jp=jp-next;if(jp!=NU1.1.)(jobnumber=jobnumber-l;totalfree=totalfree+jp-length;if(freep=NU1.1.)(fre
8、ep=(freeptr)malloc(sizeof(structfreearea);freep-address=jp-address;freep-size=jp-address;freep-next=NU1.1.;freep-back=NU1.1.;elsefp=freep;while(fp!=NU1.1.)&(fp-addressaddress)(fp=fp;fp=fp-next;1if(fp!=NU1.1.)(if(fp-next!=NU1.1.)&(fp-next-address=jp-address+jp-length)仁f+l;if(fp-back!=NU1.1.)&(jp-addr
9、ess=fpl-address+fl-size)仁f+2;)elseif(jp-address)=(fp1-address+fpl-size)f=f+2;switch(f)(caseO:(fp2=(freeptr)malloc(sizeof(structfreearea);fp2-address=jp-address;fp2-size=jp-length;fp2-next=fp;if(fp!=NU1.1.)(fp2-back=fp-back;if(fp-back!=NU1.1.)fpl-next=fp2;elsefreep=fp2;fp-back=fp2;1else(fp2-back=fpl;
10、fpl-next=fp2;1)case 1:(fp-size=fp-size+jp-length;fp-address=jp-address;)case 2:fpl-size=fpl-size+jp-length;case 3:fpl-size=fpl-size+jp-length+fp-size;fpl-next=fp-next;if(fp-next!=NU1.1.)fp-next-back=fp2;free(f);if(jp=jobp)jobp=jp-next;if(jp-next!=NU1.1.)jp-next-back=jp-back;if(jp-back!=NU1.1.)jp-bac
11、k-next=jp-next;free(jp);/*搬家*/banjia()(freeptrfp,fpl;jobptrjp;longbottom;if(jobnumber0)(jP=jobp;bottom=TOTA1.+SETADDRESS;while(jp!=NU1.1.)(jp-address=bottom-jp-length;bottom=bottom-jp-length;jp=jp-next;)fp=freep;while(fp!=NU1.1.)(fp=fp;fp=fp-next;free(fpl);)freep=(freeptr)malloc(sizeof(freeptr);free
12、p-size=totalfree;freep-address=SETADDRESS;freep-next=NU1.1.;freep-back=NU1.1.;mingling()(charname,anykeyjobname;intlength,select;intaddress;(al:clrscr();printf(,youcanselectoneofthefbllowingAn);printf(,(l)requiretobeallocaten);printf(11(2)requiretocollextethesizen);printf(,(3)checkthememoryn);printf
13、(,(4)quitsystemn);printf(,youselectis:);scanf(,%dselect);Switch(Select)(case1:if(jobnumber=MAX)printf(,thejobistoomany);else(printf(,enteryoujobnamen,);scanf(,%s,fename);printf(,enteryourjoblengthnr);scanf(,%1Od11,fclength);address=fengpei(length,name);switch(address)caseI:printf(,thememoryisfull);break;case0:(banjia();fengpei(length,name);xianshi();break;)case2:xianshi();break;*elsexianshi();*/1break;)case 2:(printf(11enterthen