您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 操作系统实验内存分配
西安邮电大学(计算机学院)课内实验报告实验名称:内存管理专业名称:软件工程班级:学生姓名:学号(8位):指导教师:实验日期:实验五:进程1.实验目的通过深入理解区管理的三种算法,定义相应的数据结构,编写具体代码。充分模拟三种算法的实现过程,并通过对比,分析三种算法的优劣。(1)掌握内存分配FF,BF,WF策略及实现的思路;(2)掌握内存回收过程及实现思路;(3)参考给出的代码思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。2.实验要求:1)掌握内存分配FF,BF,WF策略及实现的思路;2)掌握内存回收过程及实现思路;3)参考本程序思路,实现内存的申请、释放的管理程序,调试运行,总结程序设计中出现的问题并找出原因,写出实验报告。3.实验过程:创建进程:删除其中几个进程:(默认以ff首次适应算法方式排列)Bf最佳适应算法排列方式:wf最差匹配算法排列方式:4.实验心得:这次实验实验时间比较长,而且实验指导书中对内存的管理讲的很详细,老师上课的时候也有讲的很详细,但是代码比较长,刚开始的时候也是不太懂,但是后面经过和同学一起商讨,明白几种算法的含义:①首次适应算法。在采用空闲分区链作为数据结构时,该算法要求空闲分区链表以地址递增的次序链接。在进行内存分配时,从链首开始顺序查找,直至找到一个能满足进程大小要求的空闲分区为止。然后,再按照进程请求内存的大小,从该分区中划出一块内存空间分配给请求进程,余下的空闲分区仍留在空闲链中。②循环首次适应算法。该算法是由首次适应算法演变而形成的,在为进程分配内存空间时,从上次找到的空闲分区的下一个空闲分区开始查找,直至找到第一个能满足要求的空闲分区,并从中划出一块与请求的大小相等的内存空间分配给进程。③最佳适应算法将空闲分区链表按分区大小由小到大排序,在链表中查找第一个满足要求的分区。④最差匹配算法将空闲分区链表按分区大小由大到小排序,在链表中找到第一个满足要求的空闲分区。实验中没有用到循环首次适应算法,但是对其他三种的描述还是很详细,总的来说,从实验中还是学到了很多。5.程序源代码:#includestdio.h#includemalloc.h#includeunistd.h#includestdlib.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;//指向下一个空闲块};/*指向内存中空闲块链表的首指针*/structfree_block_type*free_block=NULL;/*每个进程分配到的内存块的描述*/structallocated_block{intpid;//进程标识符intsize;//进程大小intstart_addr;//进程分配到的内存块的起始地址charprocess_name[PROCESS_NAME_LEN];//进程名structallocated_block*next;//指向下一个进程控制块};/*进程分配内存块链表的首指针*/structallocated_block*allocated_block_head=NULL;intfree_block_count=0;//空闲块个数intmem_size=DEFAULT_MEM_SIZE;//内存大小intcurrent_free_mem_size=0;//当前空闲内存大小intma_algorithm=MA_FF;//当前分配算法staticintpid=0;//初始PIDintflag=0;//设置内存大小标志,表示内存大小是否设置/*函数声明*/structfree_block_type*init_free_block(intmem_size);voiddisplay_menu();intset_mem_size();voidset_algorithm();voidrearrange(intalgorithm);intrearrange_WF();intrearrange_BF();intrearrange_FF();intnew_process();intallocate_mem(structallocated_block*ab);voidkill_process();intfree_mem(structallocated_block*ab);intdispose(structallocated_block*free_ab);intdisplay_mem_usage();structallocated_block*find_process(intpid);intdo_exit();intallocate_FF(structallocated_block*ab);intallocate_BF(structallocated_block*ab);intallocate_WF(structallocated_block*ab);intallocate(structfree_block_type*pre,structfree_block_type*allocate_free_nlock,structallocated_block*ab);intmem_retrench(structallocated_block*ab);//通过内存紧缩技术给新进程分配内存空间intmem_retrench(structallocated_block*ab){structallocated_block*allocated_work,*allocated_pre=allocated_block_head;structfree_block_type*free_work,*free_pre=free_block-next;if(allocated_pre==NULL)return-1;allocated_pre-start_addr=0;allocated_work=allocated_pre-next;while(allocated_work!=NULL){allocated_work-start_addr=allocated_pre-start_addr+allocated_pre-size;allocated_pre=allocated_work;allocated_work=allocated_work-next;}free_block-start_addr=allocated_pre-start_addr+allocated_pre-size;free_block-size=current_free_mem_size;free_block-next=NULL;free_work=free_pre;while(free_pre!=NULL){free(free_pre);free_pre=free_work;if(free_pre!=NULL)free_work=free_work-next;}allocate(NULL,free_block,ab);return1;}//给新进程分配内存空间intallocate(structfree_block_type*pre,structfree_block_type*allocate_free_block,structallocated_block*ab){structallocated_block*p=allocated_block_head;ab-start_addr=allocate_free_block-start_addr;if(allocate_free_block-size-ab-sizeMIN_SLICE){ab-size=allocate_free_block-size;if(pre!=NULL){pre-next=allocate_free_block;}else{free_block=allocate_free_block-next;}free(allocate_free_block);}else{allocate_free_block-start_addr+=ab-size;allocate_free_block-size-=ab-size;}if(p==NULL){allocated_block_head=ab;}else{while(p-next!=NULL)p=p-next;p-next=ab;}current_free_mem_size-=ab-size;if(current_free_mem_size==0)free_block=NULL;return0;}//按照最坏适应算法给新进程分配内存空间intallocate_WF(structallocated_block*ab){intret;structfree_block_type*wf=free_block;if(wf==NULL)return-1;if(wf-size=ab-size)allocate(NULL,wf,ab);elseif(current_free_mem_size=ab-size)ret=mem_retrench(ab);elseret=-2;rearrange_WF();returnret;}//按照最佳适应算法给新进程分配内存空间intallocate_BF(structallocated_block*ab){intret;structfree_block_type*pre=NULL,*bf=free_block;if(bf==NULL)return-1;while(bf!=NULL){if(bf-size=ab-size){ret=allocate(pre,bf,ab);break;}pre=bf;pre=pre-next;}if(bf==NULL&¤t_free_mem_sizeab-size)ret=mem_retrench(ab);elseret=-2;rearrange_BF();returnret;}//按照首次适应算法给新进程分配内存空间intallocate_FF(structallocated_block*ab){intret;structfree_block_type*pre=NULL,*ff=free_block;if(ff==NULL)return-1;while(ff!=NULL){if(ff-size=ab-size){ret=allocate(pre,ff,ab);break;}pre=ff;pre=pre-next;}if(ff==NULL&¤t_free_mem_sizeab-size)ret=mem_retrench(ab);elseret=-2;rearrange_FF();returnret;}//分配内存模块intallocate_mem(structallocated_block*ab){intret;structfree_block_type*fbt,*pre;intrequest_size=ab-size;fbt=pre=free_block;switch(ma_algorithm){caseMA_FF:ret=allocate_FF(ab);break;caseMA_BF:ret=allocate_BF(ab);break;c
本文标题:操作系统实验内存分配
链接地址:https://www.777doc.com/doc-7387846 .html