您好,欢迎访问三七文档
当前位置:首页 > 临时分类 > 操作系统第六次-内存分配与回收模拟
操作系统课程实验报告姓名学号系计算机任课教师指导教师评阅教师实验地点丽泽楼C304-2丽泽楼C304-1(请勾选实际实验地点)实验时间实验课表现出勤和个人表现Q1(15+15(组长评分)=30分)得分:实验总分(Q1+Q2+Q3+Q4)实验完成情况Q2(45分(组长评分,教师根据实际情况微调))得分:实验编号与实验名称:第六次实验内存分配与回收模拟实验目的:通过使用位图跟踪内存使用情况,模拟和评价不同的内存分配算法;熟悉内存分配和回收。实验内容及要求(详见实验讲义与实验指导书):1)要求用你熟悉的程序设计语言编写和调试一个内存分配和回收模拟程序;要求在主函数中测试。2)实验报告中必须包括:设计思想、数据定义(包括详细说明)、处理流程(详细算法描述和算法流程图)、源代码、运行结果、体会等部分。3)必须模拟该4种内存分配算法:firstfit,nextfit,bestfit和worstfit中的至少2种。4)需显示出每次分配和回收后的空闲分区链的情况来以及内存占用情况图,并统计各种算法产生的碎片空闲区(小于3个单元(unit)的空闲区)数。5)计算2个性能参数:碎片数、平均搜索空闲区次数实验内容及关键步骤(流程图)Firstfitnextfit实验内容及关键步骤(代码)Q3(15分)(1)Firstfit代码运行结果#includestdio.hstructnot_empty//已分配分区表{charprocess_id;//作业标志符,此处采用-255的整数intaddress_of_start;//起始地址intsize_of_notempty;//作业请求的内存单元数intdelete_or_not;//进程是否被创建,是否}Not_Empty[20];voidprintnow(charram[]){//输出内存分配情况inti;for(i=1;i=128;i++){printf(%c,ram[i]);if(i%11==0)printf(\n);}printf(\n);}voidprintfree(charram[]){//输出内存空闲区和内存空闲碎片inti,flag=0,can_not_use=0;printf(空闲区间为:\n);for(i=1;i=128;i++){if(flag==0){if(ram[i]=='o'){flag=i;printf(%d,flag-1);}}else{if(ram[i]=='x'||i==128||(ram[i]='0'&&ram[i]='9')){printf(%d\n,i-1);if(i-1-flag3)can_not_use++;flag=0;}}}printf(内存空闲碎片数为:%d\n,can_not_use);}intmain(){inttime=0;charram[129],id,del;intflag=0,i,j,cos,size,what;intused_total=0;intcancreat_ornot=0;for(i=0;i20;i++)Not_Empty[i].delete_or_not=1;for(i=1;i=128;i++){ram[i]='o';}printf(1,分配;2,回收;\n3,内存占用情况图;4,退出;\n);while(scanf(%d,&what)&&what!=4){if(what==1){ave[time]=0;printf(请输入进程id(0~255),占用空间大小(0~10)\n);getchar();scanf(%c%d,&id,&cos);//输入进程id和所需空间if(Not_Empty[id-48].delete_or_not==0)//判断进程是否已经被创建{printf(进程已存在!\n);}else{for(i=1;i=128;i++){if(flag==0){if(ram[i]=='o')//判断该内存单元是否为空,是则标记第一个空的内存单元位置,已知连续的空闲单元为{flag=i;size=1;}}else{if(size==cos){//如果连续的内存单元等于进程所需内存大小,则记录相应信息Not_Empty[id-48].process_id=id;Not_Empty[id-48].address_of_start=flag;Not_Empty[id-48].size_of_notempty=cos;Not_Empty[id-48].delete_or_not=0;ram[flag]=id;cancreat_ornot=1;//标记进程分配内存成功for(j=flag+1;jflag+size;j++)ram[j]='x';//把已分配的内存标记为xbreak;}if(ram[i]=='o')size++;elseflag=0;}}if(cancreat_ornot==0)printf(没有足够的内存空间!!\n);elsecancreat_ornot=0;flag=0;printnow(ram);printfree(ram);}}elseif(what==2){printf(请输入要删除的进程号\n);getchar();scanf(%c,&del);//for(i=0;iused_total;i++)if(Not_Empty[del-48].process_id==del)if(Not_Empty[del-48].delete_or_not==0)//确认进程是否已销毁过{for(j=Not_Empty[del-48].address_of_start;jNot_Empty[del-48].address_of_start+Not_Empty[del-48].size_of_notempty;j++)ram[j]='o';printnow(ram);printfree(ram);Not_Empty[del-48].delete_or_not=1;}//标记已经销毁elseprintf(进程不存在或已销毁!\n);}if(what==3)printnow(ram);printf(1,分配;2,回收;\n3,内存占用情况图;4,退出;\n);}}(2)nextfit代码运行结果#includestdio.hstructnot_empty//已分配分区表{charprocess_id;//作业标志符,此处采用-255的整数intaddress_of_start;//起始地址intsize_of_notempty;//作业请求的内存单元数intdelete_or_not;//进程是否被创建,是否}Not_Empty[20];voidprintnow(charram[]){//输出内存分配情况inti;for(i=1;i=128;i++){printf(%c,ram[i]);if(i%11==0)printf(\n);}printf(\n);}voidprintfree(charram[]){//输出内存空闲区和内存空闲碎片inti,flag=0,can_not_use=0;printf(空闲区间为:\n);for(i=1;i=128;i++){if(flag==0){if(ram[i]=='o'){flag=i;printf(%d,flag-1);}}else{if(ram[i]=='x'||i==128||(ram[i]='0'&&ram[i]='9')){printf(%d\n,i-1);if(i-1-flag3)can_not_use++;flag=0;}}}printf(内存空闲碎片数为:%d\n,can_not_use);}intmain(){charram[129],id,del;intflag=0,i,j,cos,size,what;intnext=1;intcancreat_ornot=0;for(i=0;i20;i++)Not_Empty[i].delete_or_not=1;for(i=1;i=128;i++){ram[i]='o';}printf(1,分配;2,回收;\n3,内存占用情况图;4,退出;\n);while(scanf(%d,&what)&&what!=4){if(what==1){printf(输入进程的id(0~255)和它占用空间的大小(0~10)\n);getchar();scanf(%c%d,&id,&cos);//输入进程id和所需空间if(Not_Empty[id-48].delete_or_not==0)//判断进程是否已经被创建{printf(进程已存在!\n);}else{for(i=next;i=128;i++){if(flag==0){if(ram[i]=='o')//判断该内存单元是否为空,是则标记第一个空的内存单元位置,已知连续的空闲单元为{flag=i;size=1;}}else{if(size==cos){//如果连续的内存单元等于进程所需内存大小,则记录相应信息//printf(id:%d\n,id-48);Not_Empty[id-48].process_id=id;Not_Empty[id-48].address_of_start=flag;Not_Empty[id-48].size_of_notempty=cos;Not_Empty[id-48].delete_or_not=0;ram[flag]=id;cancreat_ornot=1;//标记进程分配内存成功//used_total++;for(j=flag+1;jflag+size;j++)ram[j]='x';//把已分配的内存标记为xnext=flag+size;break;}if(ram[i]=='o')size++;elseflag=0;}}if(i==129){for(i=1;inext;i++)if(flag==0){if(ram[i]=='o'){flag=i;size=1;}}else{if(size==cos){//printf(id:%d\n,id-48);Not_Empty[id-48].process_id=id;Not_Empty[id-48].address_of_start=flag;Not_Empty[id-48].size_of_notempty=cos;Not_Empty[id-48].delete_or_not=0;ram[flag]=id;cancreat_ornot=1;//used_total++;for(j=flag+1;jflag+size;j++)ram[j]='x';next=flag+size;flag=0;break;}if(ram[i]=='o')size++;elseflag=0;}}flag=0;if(cancreat_ornot==0)printf(没有足够的内存空间!\n);elsecancreat_ornot=0;printnow(ram);printfree(ram);}}elseif(what==2){printf(请输入要删除的进程号\n);getchar();scanf(%c,&del);if(Not_Empty[del-48].process_id==del)if(Not_Empty[del-48].delete_or_not==0)//确认进程是否已销毁过{for(j=Not_Empty[del-48].address_of_start;jNot_Empty[del-48].address_of_start+Not_Empty[del-48].size_of_notempty;j++)ram[j]='o';printnow(ram);printfree(ram);Not_Empty[del-48].delete_or_not=1;}//标记已经销毁elseprintf(进程不存在或已销毁!\n);}if(what==3)printnow(
本文标题:操作系统第六次-内存分配与回收模拟
链接地址:https://www.777doc.com/doc-4921018 .html