版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
西安邮电大学(计算机学院)课内实验报告实验名称:内存管理专业名称:软件工程班级:学生姓名:学号(8位):指导教师:实验日期:12月04日实验目的及实验环境1、实验环境Linuxcentos7系统
gcc编译器gdb调试2、实验目的(1)掌握内存分派FF,BF,WF方略及实现的思路;(2)掌握内存回收过程及实现思路;(3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出因素,写出实验报告。实验内容(1)掌握内存分派FF,BF,WF方略及实现的思路;(2)掌握内存回收过程及实现思路;(3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出因素,写出实验报告。方案设计----------------------------------------------------------Memorymanagementexperiment1-Setmemorysize(default=1024)2-Selectmemoryallocationalgorithm3-Newprocess4-killaprocess5-Displaymemoryusage0-Exit----------------------------------------------------------一、初次适应算法(FirstFit):该算法从空闲分区链首开始查找,直至找到一种能满足其大小规定的空闲分区为止。然后再按照作业的大小,从该分区中划出一块内存分派给请求者,余下的空闲分区仍留在空闲分区链中。
特点:该算法倾向于使用内存中低地址部分的空闲区,在高地址部分的空闲区极少被运用,从而保存了高地址部分的大空闲区。显然为后来达成的大作业分派大的内存空间发明了条件。
缺点:低地址部分不停被划分,留下许多难以运用、很小的空闲区,而每次查找又都从低地址部分开始,会增加查找的开销。二、循环初次适应算法(NextFit):该算法是由初次适应算法演变而成的。在为进程分派内存空间时,不再每次从链首开始查找,直至找到一种能满足规定的空闲分区,并从中划出一块来分给作业。
特点:使内存中的空闲分分辨布的更为均匀,减少了查找时的系统开销。
缺点:缺少大的空闲分区,从而造成不能装入大型作业。三、最佳适应算法(BestFit):该算法总是把既能满足规定,又是最小的空闲分分辨配给作业。为了加速查找,该算法规定将全部的空闲区按其大小排序后,以递增次序形成一种空白链。这样每次找到的第一种满足规定的空闲区,必然是最优的。孤立地看,该算法似乎是最优的,但事实上并不一定。由于每次分派后剩余的空间一定是最小的,在存储器中将留下许多难以运用的小空闲区。同时每次分派后必须重新排序,这也带来了一定的开销。
特点:每次分派给文献的都是最适宜该文献大小的分区。
缺点:内存中留下许多难以运用的小的空闲区。四、最坏适应算法(WorstFit):该算法按大小递减的次序形成空闲区链,分派时直接从空闲区链的第一种空闲区中分派(不能满足需要则不分派)。很显然,如果第一种空闲分区不能满足,那么再没有空闲分区能满足需要。这种分派办法初看起来不合理,但它也有很强的直观吸引力:在大空闲区中放入程序后,剩余的空闲区经常也很大,于是还能装下一种较大的新程序。
最坏适应算法与最佳适应算法的排序正好相反,它的队列指针总是指向最大的空闲区,在进行分派时,总是从最大的空闲区开始查寻。
该算法克服了最佳适应算法留下的许多小的碎片的局限性,但保存大的空闲区的可能性减小了,并且空闲区回收也和最佳适应算法同样复杂。
特点:给文献分派分区后剩余的空闲区不至于太小,产生碎片的几率最小,对中小型文献分派分区操作有利。
缺点:使存储器中缺少大的空闲区,对大型文献的分分辨配不利。四.测试数据及运行成果五.总结本次实验使我受益匪浅,我不仅仅学习到了专业知识,更重要的是收获了经验与体会,这些使我一生受用不尽,记下来与大家共勉:1.多学多问,学会虚心讨教。在实验前内存管理的最佳适配算法不是很会计算,向班级同窗请教后发现即使思维上有点绕,但是并不是很难,很快就理解了原理思想。2.善于思考,真正消化知识。有知到识,永远不是那么简朴的事,当你真正学会去思考时,别人的知识才干变成你自己的东西。3.前人铺路,后人修路。墨守陈规永远不会有新的建树,前人的道路固然重要,但是学会创新更为重要。4.独立而不孤立。学会独立思考,独立实验,但要记住与别人的交流也是十分重要的,实验和实验事永远不是你自己的。5.认真认真地做好实验纪录。不要当你真正用到它时才知它的重要所在。六.附录:源代码(电子版)#include<stdio.h>#include<stdlib.h>#include<ctype.h>#definePROCESS_NAME_LEN32//进程名长度#defineMIN_SLICE10//最小碎片大小#defineDEFAULT_MEM_SIZE1024//内存大小#defineDEFAULT_MEM_START0//起始地址//内存分派算法#defineMA_FF1#defineMA_BF2#defineMA_WF3//描述每一种空闲块的数据构造structfree_block_type{intsize;intstart_addr;structfree_block_type*next;};//每个进程分派到的内存块的描述structallocated_block{intpid;intsize;intstart_addr;charprocess_name[PROCESS_NAME_LEN];structallocated_block*next;};structfree_block_type*free_block;structallocated_block*allocated_block_head=NULL;intmem_size=DEFAULT_MEM_SIZE;//内存大小intma_algorithm=MA_FF;//现在分派算法staticintpid=0;//初始pidintflag=0;voiddisplay_menu();voiddo_exit();structfree_block_type*init_free_block(intmem_size);voidset_mem_size();voidset_algorithm();voidnew_process();voidkill_process();voiddisplay_mem_usage();voidrearrange(intchoice);voidrearrage_FF();voidrearrage_BF();voidrearrage_WF();intmain(){charchoice;pid=0;free_block=init_free_block(mem_size);display_menu();while(1){printf("Pleasechoice:");fflush(stdin);choice=getchar();//获取顾客输入switch(choice){case'1':set_mem_size();//设立内存大小break;case'2':set_algorithm();//设立算法flag=1;break;case'3':new_process();//创立新进程flag=1;break;case'4':kill_process();//删除进程flag=1;break;case'5':display_mem_usage();//显示内存使用flag=1;break;case'0':do_exit();//释放链表并退出exit(0);default:break;}choice=getchar();}return0;}//紧缩解决voidfree_memory_rearrage(intmemory_reduce_size,intallocated_size){structfree_block_type*p1,*p2;structallocated_block*a1,*a2;if(memory_reduce_size!=0)//分派完尚有小块空间{p1=free_block;p2=p1->next;p1->start_addr=0;p1->size=memory_reduce_size;p1->next=NULL;mem_size=memory_reduce_size;}else{p2=free_block;free_block=NULL;mem_size=0;}while(p2!=NULL)//释放节点{p1=p2;p2=p2->next;free(p1);}//allocated_block重新修改链接a1=(structallocated_block*)malloc(sizeof(structallocated_block));a1->pid=pid;a1->size=allocated_size;a1->start_addr=memory_reduce_size;//已申请的开始地址,从memory_reduce_size开始sprintf(a1->process_name,"PROCESS-%02d",pid);a1->next=allocated_block_head;a2=allocated_block_head;allocated_block_head=a1;while(a2!=NULL){a2->start_addr=a1->start_addr+a1->size;a1=a2;a2=a2->next;}}intallocate_mem(structallocated_block*ab){structfree_block_type*fbt,*pre;intrequest_size=ab->size;fbt=pre=free_block;while((pre!=NULL)&&(request_size>pre->size)){fbt=pre;pre=pre->next;}if(!pre){if(mem_size>=request_size){if(mem_size>=request_size+MIN_SLICE)free_memory_rearrage(mem_size-request_size,request_size);elsefree_memory_rearrage(0,mem_size);return0;}elsereturn-1;}else{if((pre->size-request_size)>MIN_SLICE){pre->size=pre->size-request_size;ab->start_addr=pre->start_addr+pre->size;}else{if(pre==fbt){fbt=pre->next;free_block=fbt;}elsefbt->next=pre->next;ab->start_addr=pre->start_addr;ab->size=pre->size;free(pre);}}mem_size-=ab->size;rearrange(ma_algorithm);return1;}//创立新进程,分派内存voidnew_process(){structallocated_block*ab;intsize;intret;if(mem_size==0){printf("thememoryisallused!nottocreatenewprocess,pleasereleaseprocess!\n");return;}ab=(structallocated_block*)malloc(sizeof(structallocated_block));if(ab==NULL){printf("NoMem!\n");exit(1);}ab->next=NULL;pid++;sprintf(ab->process_name,"PROCESS-%02d",pid);//字符串格式化ab->pid=pid;while(1){printf("Pleaseinputthememoryfor%s(0-%d):",ab->process_name,mem_size);scanf("%d",&size);if(size<=mem_size&&size>0){ab->size=size;break;}printf("Pleaseinputagain!\n");}ret=allocate_mem(ab);if((ret==1)&&(allocated_block_head==NULL))allocated_block_head=ab;elseif(ret==1){ab->next=allocated_block_head;allocated_block_head=ab;}elseif(ret==-1){printf("Allocationfail\n");free(ab);return;}printf("AllocationSuccess!\n");}//寻找已分派的内存块structallocated_block*find_process(intpid){structallocated_block*p;p=allocated_block_head;while(p){if(p->pid==pid)returnp;p=p->next;}returnp;}intfree_mem(structallocated_block*ab){intalgorithm=ma_algorithm;structfree_block_type*fbt,*pre,*work;mem_size+=ab->size;fbt=(structfree_block_type*)malloc(sizeof(structfree_block_type));if(!fbt)return-1;fbt->size=ab->size;fbt->start_addr=ab->start_addr;fbt->next=NULL;rearrange(MA_FF);pre=NULL;work=free_block;while((work!=NULL)&&(fbt->start_addr>work->start_addr)){pre=work;work=work->next;}if(!pre)//插入开始位置{if(!work){free_block=fbt;}else{fbt->next=work;free_block=fbt;if(fbt->start_addr+fbt->size==work->start_addr){fbt->next=work->next;fbt->size=fbt->size+work->size;free(work);}}}else{if(!work){pre->next=fbt;if(fbt->start_addr==pre->start_addr+pre->size){pre->next=work;pre->size=fbt->size+pre->size;free(fbt);}}else{fbt->next=work;pre->next=fbt;if((fbt->start_addr==pre->start_addr+pre->size)&&(fbt->start_addr+fbt->size==work->start_addr)){pre->next=work->next;pre->size=pre->size+fbt->size+work->size;free(fbt);free(work);}elseif(fbt->start_addr==pre->start_addr+pre->size){pre->next=work;pre->size=pre->size+fbt->size;free(fbt);}elseif(work->start_addr==fbt->start_addr+fbt->size){fbt->next=work->next;fbt->size=work->size+fbt->size;free(work);}}}rearrange(ma_algorithm);return1;}voiddispose(structallocated_block*free_ab){structallocated_block*pre,*ab;if(free_ab==allocated_block_head){allocated_block_head=free_ab->next;free(free_ab);return;}pre=allocated_block_head;ab=allocated_block_head->next;while(ab!=free_ab){pre=ab;ab=ab->next;}pre->next=ab->next;free(ab);}//终止进程,回收内存voidkill_process(){structallocated_block*ab;intpid;printf("Killprocess,inputpid=");scanf("%d",&pid);ab=find_process(pid);if(ab!=NULL){free_mem(ab); //释放ab所示的分派区dispose(ab); //释放ab数据构造节点printf("KillProcessSuccess!\n");return;}printf("KillProcessFailure!\n");}//显示现在内存的使用状况,涉及空闲区的状况和已经分派的状况voiddisplay_mem_usage(){structfree_block_type*fbt=free_block;structallocated_block*ab=allocated_block_head;/*显示空闲区*/printf("----------------------------------------------------------\n");if(fbt==NULL)printf("success!\n");else{printf("FreeMemory:\n");printf("%20s%20s\n","\tstart_addr","size");while(fbt!=NULL){printf("%20d%20d\n",fbt->start_addr,fbt->size);fbt=fbt->next;}}printf("----------------------------------------------------------\n");/*显示已分派区*/if(ab==NULL)printf("尚未开始分派!\n");else{printf("\nUsedMemory:\n");printf("%10s%20s%10s%10s\n","\tPID","ProcessName","start_addr","size");while(ab!=NULL){printf("%10d%20s%10d%10d\n",ab->pid,ab->process_name,ab->start_addr,ab->size);ab=ab->next;}}printf("----------------------------------------------------------\n");}//最佳适配算法voidrearrage_BF(){structfree_block_type*p,*p1,*p2;structfree_block_type*last_flag;p1=(structfree_block_type*)malloc(sizeof(structfree_block_type));p1->next=free_block;free_block=p1;//不变化p1,free_block指向头p1if(free_block!=NULL){for(last_flag=NULL;last_flag!=free_block;last_flag=p){for(p=p1=free_block;p1->next!=NULL&&p1->next->next!=NULL&&p1->next->next!=last_flag;p1=p1->next){if(p1->next->size>p1->next->next->size){p2=p1->next->next;p1->next->next=p2->next;//p2->next=p1->next;p1->next=p2;p=p1->next->next;}}}}p1=free_block;free_block=free_block->next;free(p1);p1=NULL;}//最差适配算法voidrearrage_WF(){structfree_block_type*p,*p1,*p2;structfree_block_type*last_flag;p1=(structfree_block_type*)malloc(sizeof(structfree_block_type));p1->next=free_block;free_block=p1;//不变化p1,free_block指向头p1if(free_block!=NULL){for(last_flag=NULL;last_flag!=free_block;last_flag=p){for(p=p1=free_block;p1->next!=NULL&&p1->next->next!=NULL&&p1->next->next!=last_flag;p1=p1->next){if(p1->next->size<p1->next->next->size){p2=p1->next->next;p1->next->next=p2->next;//p2->next=p1->next;p1->next=p2;p=p1->next->next;}}}}p1=free_block;free_block=free_block->next;free(p1);p1=NULL;}//最快适配算法voidrearrage_FF(){structfree_block_type*p,*p1,*p2;structfree_block_type*last_flag;p1=(structfree_block_type*)malloc(sizeof(structfree_block_type));p1->next=free_block;free_block=p1;//不变化p1,free_block指向头p1if(free_block!=NULL){for(last_flag=NULL;last_flag!=free_block;last_flag=p){for(p=p1=free_block;p1->next!=NULL&&p1->next->next!=NULL&&p1->next->next!=last_flag;p1=p1->next){if(p1->next->start_addr>p1->next->next->start_addr){p2=p1->next->next;p1->next->next=p2->next;p2->next=p1->next;p1->next=p2;p=p1->next->next;}}}}p1=free_block;free_block=free_block->next;free(p1);p1=NULL;}//初始化空闲块structfree_block_type*init_free_block(intmem_size){structfree_block_type*fb;fb=(structfree_block_type*)malloc(sizeof(structfree_block_type));if(fb==NULL){printf("NoMem!\n");exit(1);}fb->size=mem_size;fb->start_addr=DEFAULT_MEM_START;fb->next=NULL;returnfb;}voiddisplay_menu(){printf("\n");printf("----------------------------------------------------------\n");printf("Memorymanagementexperiment\n");printf("1-Setme
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 临港新建矿用防爆电机生产项目可行性研究报告
- 临港产业园新建卸船机装配厂房项目可行性研究报告
- 工程签证讲解课件
- 中药材生态种植基地可行性研究报告
- 工程全过程咨询课件
- 餐饮企业厨房助手职业技能等级认定模拟试卷及答案
- 工程介绍课件
- 公证员资格考试公证机构与公证员职责专项练习题及答案
- 观潮封面设计课件
- 构成教学课件
- 2026年电池PACK装配工考试试题(含答案)
- 中国海油2027届校园招聘笔试备考题库及答案解析
- 2026年林业部门招聘森林资源保护与利用专项试卷
- 2026秋新苏教版小学科学三年级上册全册教案
- 2026及未来5年中国中药香市场现状数据分析及前景预测报告
- 2026年西安铁路局人员招聘笔试备考题库及详细答案解析
- 2026年河南省巩义市高一化学上册期末考试检测卷含完整答案(全优)
- 2026年《中国慢性肾脏病临床管理指南(2026版)》
- 2026汽车玻璃行业发展现状分析及智能趋势与应用场景研究报告
- 2026光学薄膜产业现状分析及AR-VR驱动与镀膜技术创新
- 2025青岛水务集团有限公司招聘(89人)笔试历年参考题库附带答案详解
评论
0/150
提交评论