专业资料word完美格式洛阳理工学院实验报告系别计算机系班级学号姓名课程名称计算机操作系统实验日期2015/10/26实验名称分区内存管理成绩实验目的:过本次实验,加深对进程概念的理解,进一步掌握进程状态的转变及进程调度策略。实验条件:计算机一台,软件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#includemalloc.h#includestdlib.h#includeconio.h#definemaxPCB10专业资料word完美格式#definemaxPart10#defineTRUE1#defineFALSE0typedefstructPCB_type{charname;//进程名intaddress,len,valid;//进程所占分区起止、长度、该PCB有效标识(1有效,0无效)}PCB;typedefstructseqlist{PCBPCBelem[maxPCB];//maxPCB为系统中允许的最多进程数inttotal;//系统中实际的进程数}PCBseql;typedefstructPartition{intaddress,len,valid;//分区起址、长度、有效标识(1空闲,0已分配)}Part;typedefstructPartlist{PartPartelem[maxPart];//maxPart为系统中可能的最多分区数intsum;//系统中实际的分区数}Partseql;intlength=640;//系统有640的空闲PCBseql*pcbl;Partseql*partl;voidinitpcb(PCBseql*vpcbl,intadr);//初始化进程表vpcblvoidgetprint();voidinitpart();//初始化分区表vpartlvoidrequest(charname,intlen);//进程name请求len大小的内存专业资料word完美格式voidrelease(charname);//回收name进程所占内存空间voidprint();//输出内存空闲分区/*voidprintp(){inti;for(i=0;i(pcbl-total);i++){printf(%c\n,pcbl-PCBelem[i].name);}}*/voidinitpcb(PCBseql*vpcbl,intadr)//初始化进程表vpcbl{inti=1;PCB*pcbelem;inttel;charc;pcbelem=vpcbl-PCBelem;while(TRUE){printf(请输入第%d进程名称,i++);vpcbl-total++;scanf(%c,&(pcbelem-name));printf(请输入进程所需内存);scanf(%d,&tel);pcbelem-len=tel;pcbelem-address=adr+tel;pcbelem-valid=1;pcbelem++;printf(是否要继续输入进程(Enter-是Esc-否)\n);专业资料word完美格式fflush(stdin);c=getch();fflush(stdin);if(c==27){break;}}}voidinitpart(){charc,name;intlen;printf(请输入你的操作R.请求内存;P.输出空闲分区;S.强制进程结束;(N/n).退出\n);fflush(stdin);c=getchar();fflush(stdin);while(c!='N'||c!='n'){if(c=='R'||c=='r'){fflush(stdin);//做输入的时候要清空缓冲区printf(请输入请求内存进程的名称,长度);scanf(%c,%d,&name,&len);request(name,len);//进程请求内存}elseif(c=='P'||c=='p'){printf(\t*****VIEWbegin*****\n);getprint();专业资料word完美格式printf(\t*****VIEWend*****\n);}elseif(c=='S'||c=='s'){printf(请输入想要回收的进程名称\n);scanf(%c,&name);release(name);}printf(请输入你的操作R.请求内存;P.输出空闲分区;S.强制进程结束\n);fflush(stdin);c=getchar();fflush(stdin);}}voidinit4IOS(inttem){Part*newPart=&partl-Partelem[0];tem=tem0?(temlength?tem:length):0;newPart-address=0;newPart-len=tem;newPart-valid=1;partl-sum++;printf(-------已为操作系统分配了%dkb内存\n,tem);newPart=&partl-Partelem[1];newPart-address=tem;length=tem=length-tem;tem=tem0?(0):tem;newPart-len=tem;newPart-valid=0;partl-sum++;专业资料word完美格式printf(-------为操作系统分配后剩余的内存%dkb内存\n,tem);}intgetTagByPcb(charname){inti=0;for(;i(pcbl-total);i++){if(name==pcbl-PCBelem[i].name){returni;}}returnpcbl-total+1;}//分配出去就会产生一个碎片将元素后移动一位voidArrayToRightOne(inti){intleng=partl-sum;while(lengi){partl-Partelem[leng].address=partl-Partelem[leng-1].address;partl-Partelem[leng].len=partl-Partelem[leng-1].len;partl-Partelem[leng].valid=partl-Partelem[leng-1].valid;leng--;}partl-sum++;}intfindBylen(intlen){inti=0;while(ipartl-sum)专业资料word完美格式{if(partl-Partelem[i].valid==0){if(len=partl-Partelem[i].len){returni;}}i++;}return0;}voidrequest(charname,intlen){chartem;inti;//是name进程的下标inttemBylen;inttemByPcb;temByPcb=getTagByPcb(name);while(temByPcbpcbl-total){printf(找不到进程%c,重新输入Y/N,name);fflush(stdin);tem=getchar();if(tem=='Y'){fflush(stdin);//做输入的时候要清空缓冲区printf(请输入请求内存进程的名称,长度);scanf(%c,%d,&name,&len);if(lenpcbl-PCBelem[temByPcb].len){专业资料word完美格式printf(您请求的容量大于您进程最大要求量%d,,pcbl-PCBelem[temByPcb].len);return;}}if(tem=='N'){return;}}//找到一块len内存if(findBylen(len)==0){//sort2part();//收集内存代码没写}if((i=findBylen(len))==0){printf(警告内存已满无法分配\n);}//分配出去就会产生一个碎片将元素后移动一位10/16ArrayToRightOne(i);//直接对partl-Partelem[i]赋值并加入一个碎片temBylen=partl-Partelem[i].len-len;partl-Partelem[i].len=len;partl-Partelem[i].valid=1;//新的碎片partl-Partelem[i+1].address=partl-Partelem[i].address+partl-Partelem[i].len;partl-Partelem[i+1].len=temBylen;partl-Partelem[i+1].valid=0;//更新pcb的状态和容量专业资料word完美格式pcbl-PCBelem[temByPcb].address=partl-Partelem[i].address;pcbl-PCBelem[temByPcb].len=pcbl-PCBelem[temByPcb].len-len;//更新pcb的lenpcbl-PCBelem[temByPcb].valid=1;}voidrelease(charname){inti=0;intadress,len;if((getTagByPcb(name))0){printf(找不到进程名%c\n,name);return;}elseif(pcbl-PCBelem[getTagByPcb(name)].valid=0){printf(%c还没有运行请先运行\n,name);}printf(现在正回收%c的内存\n,name);adress=pcbl-PCBelem[getTagByPcb(name)].address;len=pcbl-PCBelem[getTagByPcb(name)].len;while(ipartl-sum){if(adress==partl-Partelem[i].address){partl-Partelem[i].valid=0;}i++;}}voidgetprint()专业资料word完美格式{inti;printf(------空闲分区begin---------\n);for(i=0;ipartl-sum;i++){if(partl-Partelem[i].valid==0){printf(第%d块空闲内存起止为%d,容量为%d\n,i,partl-Partelem[i].address,partl-Partelem[i].len);}}printf(------空闲分区end---------\n);}voidmain(){chartem;intOSsize=40;constintM=25;pcbl=(PCBseql*)malloc(sizeof(PCBseql));partl=(Partseql*)malloc(sizeof(Partseql));partl-sum=0;pcbl-total=0;init4IOS(OSsize);//为进程分配内存initpcb(pcbl,OSsize);initpart();scanf(%c,&tem);}专业资料word完美格式实验