____大学____学院实验报告课程名称:计算机操作系统实验名称:存储管理实验实验日期:班级:姓名:学号:仪器编号:XX实验报告要求:1.实验目的2.实验要求3.实验步骤4.程序清单5.运行情况6.流程图7.实验体会1、实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。2、实验要求设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。3、实验步骤(1)理解实验要求,联系所学知识;(2)根据要求编写调度算法;(3)编写完整的实验代码并在VC++环境下编译运行;(4)调试程序直至得出结果。4、程序清单#include#include#include#include#defineNUM4#definealloMemory(type)(type*)malloc(sizeof(type))structpartiTab{intno;intsize;intfirstAddr;charstate;}parTab[NUM];typedefstructpartiTabPARTITAB;typedefstructjcb{/*定义作业控制块JCB,部分信息省略*/charname[10];tate='Y';elseprintf(没有空闲分区,无法分配内存!\n);}}voidcreateTab(){inti;for(i=1;i=NUM;i++){o=i;parTab[i-1].size=20;parTab[i-1].firstAddr=21;parTab[i-1].state='N';}}voidcheckTab(){inti;printf(分区号\t大小\t起址\t状态\n);for(i=0;iNUM;i++){printf(%d\t,parTab[i].no);printf(%d\t,parTab[i].size);printf(%d\t,parTab[i].firstAddr);printf(%c\t,parTab[i].state);printf(\n);}}voidrecycleMemory(inti){parTab[i-1].state='N';}intmain(intargc,char*argv[]){inti;printf(\n\n\t\t*********************************************\t\t\n);printf(\t\t\t\t实验一存储管理实验\n);printf(\t\t\t\t固定式分区分配存储管理\n);printf(\t\t*********************************************\t\t\n);createTab();checkTab();printf(请按任意键继续:\n);getchar();printf(每个分区装入一道作业:\n);for(i=0;iNUM;i++){AllocateMemory((i+1)*3);}checkTab();printf(请按任意键继续:\n);getchar();printf(假如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第2分区)\n);recycleMemory(2);checkTab();printf(请按任意键继续:\n);getchar();printf(接着,从外存后备作业队列中选择一个作业装入该分区(假如该作业大小为10)\n);AllocateMemory(10);checkTab();return0;}#include#include#include#include#definen10#definem10#defineminisize100struct{floataddress;floatlength;intflag;}used_table[n];struct{floataddress;floatlength;intflag;}free_table[m];voidallocate(charJ,floatxk){inti,k;floatad;k=-1;for(i=0;im;i++)if(free_table[i].length=xk&&free_table[i].flag==1)if(k==-1||free_table[i].lengthfree_table[k].length)k=i;if(k==-1){printf(无可用空闲区\n);return;}if(free_table[k].length-xk=minisize){free_table[k].flag=0;ad=free_table[k].address;xk=free_table[k].length;}else{free_table[k].length=free_table[k].length-xk;ad=free_table[k].address+free_table[k].length;}i=0;while(used_table[i].flag!=0&&in)i++;if(i=n){printf(无表目填写已分分区,错误\n);if(free_table[k].flag==0)free_table[k].flag=1;else{free_table[k].length=free_table[k].length+xk;return;}}else{used_table[i].address=ad;used_table[i].length=xk;used_table[i].flag=J;}return;}voidreclaim(charJ){inti,k,j,s,t;floatS,L;s=0;while((used_table[s].flag!=J||used_table[s].flag==0)&&sn)s++;if(s=n){printf(找不到该作业\n);return;}used_table[s].flag=0;S=used_table[s].address;L=used_table[s].length;j=-1;k=-1;i=0;while(im&&(j==-1||k==-1)){if(free_table[i].flag==1){if(free_table[i].address+free_table[i].length==S)k=i;if(free_table[i].address==S+L)j=i;}i++;}if(k!=-1)if(j!=-1)/*上邻空闲区,下邻空闲区,三项合并*/{free_table[k].length=free_table[j].length+free_table[k].length+L;free_table[j].flag=0;}else/*上邻空闲区,下邻非空闲区,与上邻合并*/free_table[k].length=free_table[k].length+L;elseif(j!=-1)/*上邻非空闲区,下邻为空闲区,与下邻合并*/{free_table[j].address=S;free_table[j].length=free_table[j].length+L;}else/*上下邻均为非空闲区,回收区域直接填入*/{/*在空闲区表中寻找空栏目*/t=0;while(free_table[t].flag==1&&tm)t++;if(t=m)/*空闲区表满,回收空间失败,将已分配表复原*/{printf(主存空闲表没有空间,回收空间失败\n);used_table[s].flag=J;return;}free_table[t].address=S;free_table[t].length=L;free_table[t].flag=1;}return;}/*主存回收函数结束*/intmain(){printf(\n\n\t\t*********************************************\t\t\n);printf(\t\t\t\t实验三存储管理实验\n);printf(\n\t\t\t可变式分区分配(最佳适应算法)\n);printf(\t\t*********************************************\n);inti,a;floatxk;charJ;/*空闲分区表初始化:*/free_table[0].address=10240;/*起始地址假定为10240*/free_table[0].length=10240;/*长度假定为10240,即10k*/free_table[0].flag=1;/*初始空闲区为一个整体空闲区*/for(i=1;im;i++)free_table[i].flag=0;/*其余空闲分区表项未被使用*//*已分配表初始化:*/for(i=0;in;i++)used_table[i].flag=0;/*初始时均未分配*/while(1){printf(功能选择项:\n1。显示主存\n2。分配主存\n3。回收主存\n4。退出\n);printf(请选择相应功能1--4:);scanf(%d,&a);switch(a){case4:exit(0);/*a=4程序结束*/case2:/*a=2分配主存空间*/printf(输入作业名J和作业所需空间xk:);scanf(%*c%c%f,&J,&xk);allocate(J,xk);/*分配主存空间*/break;case3:/*a=3回收主存空间*/printf(输入要回收分区的作业名);scanf(%*c%c,&J);reclaim(J);/*回收主存空间*/break;case1:/*a=1显示主存情况*//*输出空闲区表和已分配表的内容*/printf(输出空闲区表:\n起始地址分区长度标志\n);for(i=0;im;i++)printf(%%%6d\n,free_table[i].address,free_table[i].length,free_table[i].flag);printf(按任意键,输出已分配区表\n);getch();printf(输出已分配区表:\n起始地址分区长度标志\n);for(i=0;in;i++)if(used_table[i].flag!=0)printf(%%%6c\n,used_table[i].address,used_table[i].length,used_table[i].flag);elseprintf(%%%6d\n,used_table[i].address,used_table[i].length,used_table[i].flag);break;default:printf(没有该选项\n);}/*case*/}/*while*/return1;}#includeiostream#includestringusingnamespacestd;typedefstructQuick{intqs;umss[ss1].flagss[ss1].plenss[ss1].psta;cout请初始化第ss1段的页