您好,欢迎访问三七文档
12020/1/24内存管理模拟实验要求:设计一个内存管理模拟系统并调试运行。下例仅供参考,大家编程时可任选一语言,任选一种内存分配和回收方法,可上网找一些较好的相关算法及思路,作为编程参考,理解后再独立编程。没有必要被下例束缚(下例很简单)。例:可变分区管理:存储分配算法采用首次适配算法。用外碎片的处理用“拼接”和“搬迁”技术。22020/1/24•近期要完成的3次实验,即已布置的实验内容:1。进程同步互斥(信号量模拟),包括进程调度。2。银行家算法3。内存管理模拟•其中,第1个实验可将进程调度含在其中(这样第1个问题只要写一个实验报告),也可将第1个问题写2个实验报告,分别是信号量模拟,进程调度。•实验程序不受例子的限制,只要围绕实验主题即可,可以到网上查相关资料,并进行修改完善。•希望实验程序不雷同,百花齐放各有特色最好。32020/1/24主要数据结构#defineNULL0#includedos.h#includemem.h#includestring.h#includestdio.h#definetotal5000//整个内存的大小#definesetaddress2000//用户区开始地址#definemin100//碎片界#definemax10//最大作业数42020/1/24主存分配表MATtypedefstructmat{charname[10];intaddress;intlength;structmat*next;structmat*back;}jobptr;jobptr*jobp;52020/1/24自由块链typedefstructfreearea{intaddress;intsize;structfreearea*next;structfreearea*back;}freeptr;freeptr*freep;62020/1/24有关变量及模块inttotalfree;//总自由空间intjobnumber;//作业数voidinitiation();//初始化代码intffallocation();//分配模块voidshowyou();//显示当前内存状态voidffcollection();//回收voidcoalesce();//碎片处理voidmenu();//主菜单程序72020/1/24初始化1.voidinitiation()2.{freep=(freeptr*)malloc(sizeof(freeptr));3.freep-size=total;4.freep-address=setaddress;5.freep-next=NULL;6.freep-back=NULL;7.totalfree=total;8.jobp=NULL;9.jobnumber=0;10.}intffallocation(jl,jn)intjl;//作业长度charjn[10];//作业名{intja;freeptr*fp;jobptr*jp,*jp1,*jp2;ja=-1;if(totalfreejl){printf(can'tallocation);return;}ja=0;fp=freep;while(fp!=NULL)if(fp-sizejl)fp=fp-next;else{jobnumber++;totalfree=totalfree-jl;jp2=(jobptr*)malloc(sizeof(jobptr));strcpy(jp2-name,jn);jp2-length=jl;jp2-address=fp-address;ja=jp2-address;if(jobp==NULL){jp2-next=NULL;jp2-back=NULL;jobp=jp2;}if(fp-size-jlmin){if(fp-next!=NULL)fp-next-back=fp-back;if(fp-back!=NULL)fp-back-next=fp-next;elsefreep=fp-next;}else{fp-size=fp-size-jl;fp-address=fp-address+jl;}return(ja);}}else{jp=jobp;while((jp!=NULL)&&(jp2-addressjp-address)){jp1=jp;jp=jp-next;}jp2-next=jp;if(jp==NULL){jp2-back=jp1;jp1-next=jp2;}else{jp2-back=jp-back;if(jp-back!=NULL)jp1-next=jp2;elsejobp=jp2;jp-back=jp2;}}voidshowyou(){jobptr*jp;system(cls);if(jobnumber0)printf(nojob\n);else{printf(namelengthaddress\n);jp=jobp;while(jp!=NULL){printf(%11s%11d%13d\n,jp-name,jp-length,jp-address);jp=jp-next;}}printf(thetotalleftis%dbyte\n,totalfree);}voidffcollection(jn)charjn[10];{freeptr*fp,*fp1,*fp2;jobptr*jp;intf;jp=jobp;f=0;while((jp!=NULL)&&strcmp(jp-name,jn))jp=jp-next;if(jp!=NULL){jobnumber--;totalfree=totalfree+jp-length;if(freep==NULL){freep=(freeptr*)malloc(sizeof(freeptr));freep-address=jp-address;freep-size=jp-length;freep-next=NULL;freep-back=NULL;}else{fp=freep;while((fp!=NULL)&&(fp-addressjp-address)){fp1=fp;fp=fp-next;}if(fp!=NULL){if((fp-next!=NULL)&&(fp-next-address==jp-address+jp-length))f=f+1;if((fp-back!=NULL)&&(jp-address==fp-address+fp-size))f=f+2;}elseif(jp-address==fp1-address+fp1-size)f=f+2;switch(f){case0:{fp2=(freeptr*)malloc(sizeof(freeptr));fp2-address=jp-address;fp2-size=jp-length;fp2-next=fp;if(fp!=NULL){fp2-back=fp-back;if(fp-back!=NULL)fp1-next=fp2;elsefreep=fp2;fp-back=fp2;}else{fp2-back=fp1;fp1-next=fp2;}break;}case1:{fp-size=fp-size+jp-length;fp-address=jp-address;break;}case2:{fp1-size=fp-size+jp-length;break;}case3:{fp-size=fp1-size+jp-length+fp-size;fp1-next=fp-next;if(fp-next!=NULL){fp-next-back=fp2;free(fp);}break;}}}if(jp==jobp)jobp=jp-next;if(jp-next!=NULL)jp-next-back=jp-back;if(jp-back!=NULL)jp-back-next=jp-next;free(jp);}if(!(strcmp(jp-name,jn)))printf(cant'tfind%s,socan'tcollect%s,jn,jn);}voidcoalesce(){freeptr*fp,*fp1;jobptr*jp;intbottom;if(jobnumber0){jp=jobp;bottom=total+setaddress;while(jp!=NULL){jp-address=bottom-jp-length;bottom=bottom-jp-length;jp=jp-next;}fp=freep;while(fp!=NULL){fp1=fp;fp=fp-next;free(fp1);}freep=(freeptr*)malloc(sizeof(freeptr));freep-size=totalfree;freep-address=setaddress;freep-next=NULL;freep-back=NULL;}}voidmenu(){charname[10];intlength,address;intselect=0;while(select!=4){system(cls);printf(\n);printf(************memorymanagementprogram**********\n);printf(\n);printf(\n);printf(youcanselectoneofthefollowing:\n);printf(____________________________________________________\n);printf((1)requiretobeallocate.\n);printf((2)requiretocollectethesize.\n);printf((3)checkthememory.\n);printf((4)quit.\n);printf(____________________________________________________\n);printf(\n);printf(\n);printf(whichwouldyouselect?pleaseinpute1,2,3,4.\n);scanf(%d,&select);while((select!=1)&&(select!=2)&&(select!=3)&&(select!=4))scanf(%d,&select);switch(select){case1:{if(jobnumbermax)printf(thejobistoomany.\n);else{printf(enteryoujobname:\n);scanf(%s,name);printf(enteryoujoblength:\n);scanf(%d,&length);address=ffallocation(length,name);switch(address){case-1:printf(themomoryisfull.\n);break;case0:{coalesce();ffallocation(length,name);showyou();break;}default:showyou();break;}}getch();break;}case2:{printf(\nenterthenameofthejobwanttocollectthesize:\n);scanf(%s,name);ffcollection(name);showyou();getch();break;}case3:{showyou();getch(
本文标题:内存管理上机实验
链接地址:https://www.777doc.com/doc-3289355 .html