您好,欢迎访问三七文档
当前位置:首页 > 商业/管理/HR > 公司方案 > 操作系统“内存管理”实验报告
1/8洛阳理工学院实验报告系别计算机班级B100506学号B10050634姓名孙帅杰课程名称操作系统实验日期2012.11.29实验名称内存管理成绩实验目的:通过这次实验,加深对内存管理的认识,进一步掌握内存的分配、回收算法的思想。实验条件:windows操作系统PC一台;VC++6.0平台实验原理:设计程序模拟内存的动态分区内存管理方法。内存空闲区使用空闲分区表进行管理,采用最先适应算法从空闲分区表中寻找空闲区进行分配,内存回收时不考虑与相邻空闲区的合并。假定系统的内存共640K,初始状态为操作系统本身占用40K。t1时刻,为作业A、B、C分配80K、60K、100K、的内存空间;t2时刻作业B完成;t3时刻为作业D分配50K的内存空间;t4时刻作业C、A完成;t5时刻作业D完成。要求编程序分别输出t1、t2、t3、t4、t5时刻内存的空闲区的状态。实验内容:#includestdio.h#includestdlib.h#definemaxPCB6//最大进程数#definemaxPart6//最大空闲分区数#definesize10//不在切割剩余分区的大小typedefstructPCB_type{charname;//进程名intaddress;//进程所占分区首地址intlen;//进程所占分区的长度intvalid;//PCB标识符(有效,无效)}PCB;typedefstructseqlist//进程信息队列{PCBPCBelem[maxPCB];//maxPCB为系统中允许的最多进程数inttotal;//系统中实际的进程数2/8}PCBseql;//分区类型的描述typedefstructPartition{intaddress;//分区起址intlen;//分区的长度intvalid;//有效标识符(有效,无效)}Part;//内存空闲分区表(顺序表)描述typedefstructPartlist//空白分区链{PartPartelem[maxPart];//maxPart为系统中可能的最多空闲分区数intsum;//系统中世纪的分区数}Partseql;//全局变量PCBseql*pcbl;//进程队列指针Partseql*partl;//空闲队列指针#includeMainManager.hvoidinitpcb()//初始化进程表vpcbl{inti;pcbl-PCBelem[0].address=0;pcbl-PCBelem[0].len=40;pcbl-PCBelem[0].name='s';pcbl-PCBelem[0].valid=1;pcbl-total=0;for(i=1;imaxPCB;i++){pcbl-PCBelem[i].name='\0';pcbl-PCBelem[i].address=0;pcbl-PCBelem[i].len=0;pcbl-PCBelem[i].valid=0;}}voidinitpart()//初始化空闲分区表vpartl{inti;partl-Partelem[0].address=40;partl-Partelem[0].len=600;partl-Partelem[0].valid=1;for(i=1;imaxPart;i++){partl-Partelem[i].address=0;partl-Partelem[i].len=0;3/8partl-Partelem[i].valid=0;}partl-sum=1;}voidrequest(charname,intlen)//进程name请求len大小的内存{inti,j,k;intaddress;for(i=0;ipartl-sum;i++){if(partl-Partelem[i].len=len){address=partl-Partelem[i].address;if(partl-Partelem[i].len-len=size){partl-Partelem[i].address+=len;partl-Partelem[i].len-=len;partl-Partelem[i].valid=1;}else{for(j=i;jmaxPart-1;j++){partl-Partelem[j]=partl-Partelem[j+1];}partl-Partelem[j].valid=0;partl-Partelem[j].address=0;partl-Partelem[j].len=0;partl-sum--;}for(k=0;kmaxPCB;k++){if(pcbl-PCBelem[k].valid==0){pcbl-PCBelem[k].address=address;pcbl-PCBelem[k].len=len;pcbl-PCBelem[k].name=name;pcbl-PCBelem[k].valid=1;pcbl-total++;break;}}break;}4/8elseprintf(内存紧张,暂时不予分配,请等待!);}}voidrelease(charname)//回收name进程所占内存空间{inti;for(i=0;imaxPCB;i++){if(pcbl-PCBelem[i].name==name){if(pcbl-PCBelem[i].valid==0)printf(%c进程非运行进程,无法结束!,name);else{pcbl-PCBelem[i].valid=0;pcbl-total--;partl-Partelem[partl-sum].address=pcbl-PCBelem[i].address;partl-Partelem[partl-sum].len=pcbl-PCBelem[i].len;partl-Partelem[partl-sum].valid=1;partl-sum++;}}}}voidprint()//输出内存空闲分区{inti;printf(当前的进程有:\n);printf(nameaddresslength\n);for(i=1;imaxPCB;i++){if(pcbl-PCBelem[i].valid==1)printf(%c%d%d\n,pcbl-PCBelem[i].name,pcbl-PCBelem[i].address,pcbl-PCBelem[i].len);}printf(当前的空闲分区有:\n);printf(addresslength\n);for(i=0;imaxPart;i++){5/8if(partl-Partelem[i].valid==1)printf(%d%d\n,partl-Partelem[i].address,partl-Partelem[i].len);}}voidmain(){charch;charpcbname;intpcblen;PCBseqlpcb;Partseqlpart;pcbl=&pcb;partl=∂initpcb();initpart();printf(\t****************************MENU****************************\n);printf(\t**************Enter:r请求分配内存**************\n);printf(\t**************Enter:s结束进程**************\n);printf(\t**************Enter:p打印分配情况**************\n);printf(\t**************Enter:e退出**************\n);ch=getchar();fflush(stdin);while(ch!='e'){switch(ch){case'r':printf(请输入请求进程的name,len:);scanf(%c%d,&pcbname,&pcblen);fflush(stdin);request(pcbname,pcblen);break;case's':printf(请输入要结束进程的name:);scanf(%c,&pcbname);fflush(stdin);release(pcbname);break;case'p':print();6/8break;case'e':exit(0);}ch=getchar();fflush(stdin);}}原始数据纪录:输入数据及输出数据:****************************MENU******************************************Enter:r请求分配内存****************************Enter:s结束进程****************************Enter:p打印分配情况****************************Enter:e退出**************r请输入请求进程的name,len:a80r请输入请求进程的name,len:b60r请输入请求进程的name,len:c100p当前的进程有:nameaddresslengtha4080b12060c180100当前的空闲分区有:addresslength280360s请输入要结束进程的name:bp7/8当前的进程有:nameaddresslengtha4080c180100当前的空闲分区有:addresslength28036012060r请输入请求进程的name,len:d50p当前的进程有:nameaddresslengtha4080d28050c180100当前的空闲分区有:addresslength33031012060s请输入要结束进程的name:ap当前的进程有:nameaddresslengthd28050c180100当前的空闲分区有:addresslength330310120608/84080s请输入要结束进程的name:cs请输入要结束进程的name:dp当前的进程有:nameaddresslength当前的空闲分区有:addresslength33031012060408018010028050实验总结:本次试验的输出结果和预计输出一致,通过本次试验,使我更加深刻的理解了内存的管理,分配和回收等。本次试验也是对理论学习进行了模拟的实践,是对课本知识更深层次的理解,使我更深的认识到不同的分配算法、回收算法的优缺点,同时自己的编程能力也有所提高。
本文标题:操作系统“内存管理”实验报告
链接地址:https://www.777doc.com/doc-5417441 .html