1、操作系统存储管理实验报告大学学院实验报告课程名称: 计算机操作系统 实验名称: 存储管理实验 实验日期:班级: 姓名: 学号: 仪器编号:XX实验报告要求:1.实验目的2.实验要求3.实验步骤4.程序清单5.运行情况 6.流程图7.实验体会1、 实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解, 熟悉虚存管理的各种页面淘汰法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。2、 实验要求设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按
2、照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。3、 实验步骤(1)理解实验要求,联系所学知识; (2)根据要求编写调度算法; (3)编写完整的实验代码并在 VC+6.0环境下编译运行; (4)调试程序直至得出结果。4、 程序清
3、单#i nclude #in clude #in clude#in clude #defi ne NUM 4#define alloMemory(type) (type*)malloc(sizeof(type) struct partiTabint no;int size;int firstAddr;char state;parTabNUM;typedef struct partiTab PARTITAB;typedef struct jcb /* 定义作业控制块 JCB ,部分信息省略*/char name10; / 作业名int size; /作业大小struct jcb* link; /
4、 链指针JCB;typedef structJCB *fron t,*rear;jcbQue;jcbQue *jcbReadyQue;void AllocateMemory(i nt size);void createTab();void checkTab();void recycleMemory(i nt i);void AllocateMemory(i nt size)int i;for(i=O;isize)parTabi.state二Y;elsen);pri ntf( 没有空闲分区,无法分配内存!void createTab()int i;for( i=1;i=NUM;i+)/getPa
5、rtiTab(PARTITAB);parTabi-1. no 二i;parTabi-1.size=20;parTabi-1.firstAddr=21;parTabi-1.state=N;void checkTab()int i;printf( 分区号t大小t起址t状态n);for(i=0;iNUM;i+)pri ntf(%dt,parTabi. no);prin tf(%dt,parTabi.size);prin tf(%dt,parTabi.firstAddr);pri ntf(%ct,parTabi.state);pri ntf(n);void recycleMemory(i nt i)p
6、arTabi-1.state=N;int main (i nt argc, char* argv)int i;createTab();checkTab();printf(” 请按任意键继续:n);getchar();prin tf( 每个分区装入一道作业:n);for(i=0;iNUM;i+)AllocateMemory(i+1)*3);checkTab();printf(” 请按任意键继续:n);getchar();printf( 假如一段时间后,其中一个作业结束, 回收给它分配的分区(假如该作业在第2分区)n);recycleMemory(2);checkTab();printf(” 请按
7、任意键继续:n);getchar();printf( 接着,从外存后备作业队列中选择一个作业装入该分区 (假如该作业大小为10)n);AllocateMemory(10);checkTab();#in clude #in elude #in clude#in clude#defi ne n 10#defi ne m 10#defi ne mini size 100 structfloat address;float len gth;int flag;used_table n;structfloat address;float len gth;int flag;free_tablem;void
8、allocate(char J,float xk)int i,k;float ad;k=-1;for(i=0; i=xk&free_tablei.flag=1) if(k=-1|free_tableie ngthfree_tableke ngth) k=i;if(k=-1)printf( 无可用空闲区n);return;if(free_tablek.le ngth-xk=mi nisize)free_tablek.flag=0;ad二free_tablek.address;xk=free_tableken gth;elsefree_tablek.le ngth二free_tableken gt
9、h-xk; ad=free_tablek.address+free_tablek.le ngth;i=0;while(used_tablei.flag!=0&i 二n)pri ntf( 无表目填写已分分区,错误n);if(free_tablek.flag=O) free_tablek.flag=1;elsefree_tablek.le ngth二free_tablek en gth+xk; return;else used_tablei.address二ad; used_tableie ngth二xk; used_tablei.flag=J;return;void reclaim(char J
10、)int i,k,j,s,t;float S,L;s=0;while(used_tables.flag!二J|used_tables.flag=0)&s=n)printf(” 找不到该作业n);return;used_tables.flag=O;S=used_tables.address;L=used_tablese ngth;j=-1;k=-1;i=0;while(im&(j=-1|k=-1)if(free_tablei.flag=1)if(free_tablei.address+free_tableie ngth=S)k=i;if(free_tablei.address=S+L)j=i;i
11、+;if(k!=-1)if(j!=-1) /* 上邻空闲区,下邻空闲区,三项合并 */ free_tableke ngth二free_tableje ngth+free_tableke ngth+L; free_tablej.flag=O;else/*上邻空闲区,下邻非空闲区,与上邻合并 */free_tablek.le ngth二free_tablek en gth+L;else if(j!=-1) /* 上邻非空闲区,下邻为空闲区,与下邻合并 */free_tablej.address=S;free_tablej.le ngth二free_tablejen gth+L;else /* 上下
12、邻均为非空闲区,回收区域直接填入 */*在空闲区表中寻找空栏目*/t=0;while(free_tablet.flag=1 &t=m) /* 空闲区表满,回收空间失败,将已分配表复原*/printf( 主存空闲表没有空间,回收空间失败n);used_tables.flag二J;return;free_tablete ngth二L;free_tablet.flag=1; return;/*主存回收函数结束*/int main()pri ntf(nntt*ttn);printf(tttt 实验三 存储管理实验n”);printf(nttt 可变式分区分配(最佳适应算法)n);int i,a;flo
13、at xk;char J;/*空闲分区表初始化:*/free_table0.address=10240; /*其余空闲分区表项未被使用*/free_table0.flag=1; /* for(i=1; im; i+) free_tablei.flag=0; /* /*已分配表初始化:*/ for(i=0; in; i+) while(1)退出n);printf( 功能选择项:n1。显示主存n2。分配主存n3。回收主存n4prin tf( 请选择相应功能1-4 :);sea nf(%d, &a);switch(a)case 4:exit(O); /*a=4 程序结束 */case 2: /*a=
14、2 分配主存空间*/printf( 输入作业名J和作业所需空间xk:);sea nf(%*c%c%f, &J, &xk);allocate(J,xk); /* 分配主存空间 */break;case 3: /*a=3 回收主存空间*/printf( 输入要回收分区的作业名);sca nf(%*c%c, &J);reclaim(J); /* 回收主存空间*/break;case 1: /*a=1 显示主存情况*/*输出空闲区表和已分配表的内容 */printf( 输出空闲区表:n起始地址分区长度标志n);for(i=0; im; i+) free_tablei.flag);printf( 按任意
15、键,输出已分配区表n);getch();printf( 输出已分配区表:n起始地址 分区长度 标志n);for(i=0; in; i+)if(used_tablei.flag!=O)prin tf(%6.0f%9.0f%6cn,used_tablei.address,used_tableie ngth,used_tablei.flag);elseprin tf(%6.0f%9.0f%6dn,used_tablei.address,used_tableie ngth,used_tablei.flag);break;default:printf( 没有该选项n);/*case*/*while*/r
16、eturn 1;#i nclude#in cludeusing n amespace std;typedef struct Quickint qs;/ 快表段号int qp; 快表页号int qb; 快表段号 Quick;typedef struct Dataint num;/ 内存的块数string str;/ 对应数据块的作业内容,简化起见说明内容为一串字符 Data;/页表typedef struct Pageint nu m;页号int flag;/页状态,即是否在内存int block;/该页对应的块号 Page;typedef struct Stackint nu m;段号int
17、flag;/段状态int ple n; /页表长度int psta;/页表始址 Stack;/段表寄存器typedef struct Stareint ssta;/ 段表始址int sle n;/ 段表长度 Stare;Stack ss10;/ 全局变量Stare st;/ 全局变量Data work20; 全局变量Quick qu;/ 全局变量Page page 55;bool menu flag=0;int bbs; 内存块大小int bs;/ 内存大小void menu();void start();void cha nge();int mai n()menu();return 0;vo
18、id menu()coutvnntt*ttendl;couttttt实验三 存储管理实验endl;coutnttt段页式存储管理的地址转换的模拟程序 e ndl;couttt*e ndl;cout 请选择:endl;coute ndl;cout 1 、初始化表 e ndl;cout 2 、物理地址转换 e ndl;coutvv 3 、退出 men u1;if(me nu1!=1 &men u1!=2&men u1!=3)coutvv 请输入正确的选项endl;menu();switch(me nu1)case 1:menu flag=1;start();break;case 2:if(me n
19、u flag=O)cout 请初始化表 bs;cout 请输入内存块的大小(k)endl;cin bbs;int block num;block num 二bs/bbs;cout 内存一共被分为blocknum块,每块bbsk 一 共vvbspn;/ 下面求所有进程的总段数和段表,并为每段创建页表int sums=O;for (i nt pn 1=0; pn 1p n; pn 1+)cout 请输入第pn1个进程的段数 pp n;sums+=pp n;for(i nt ss1=0; ss1sums; ss1+)COUt 请输入第VVSSlVV个段表数据:段号,状态,页表长度,页表始址 ssss
20、1. num ssss1.flagssss1.ple n ssss1.psta;COUt 请初始化第ss1段的页表,输入两个数据页表状态和对应块号e ndl;for(i nt sss1=0; sss1ssss1.ple n; sss1+)pagess1sss1. num 二sss1;Cout 请输入该段第sss1 pagess1sss1.flagpagess1sss1.block;/ 初始化段表寄存器coutvv 初始化段表寄存器的段表始址 st.ssta;st.sle n=sums;/ 初始化内存中物理地址每一块的数据区COUt 简单起见,我们对物理地址的每一块用字符串进行简单的初始化, 没
21、有具体到每一物理地址endl;for (int bn=0; bn vblock num; bn+)workb n. num二bn;coutvv 请输入第bn个内存块里的作业内容 workb n.str;/ 初始化快表coutvv 简单起见,我们初始化快表只有一个 e ndl;coutvv 请输入要作为快表的段号和页号 q u.qbqu.qp;while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1)coutvv 该页不在内存请输入一页在内存中的作为快表 ,请输入要作为快表cinq u.qbqu.qp;qu.qs二pagequ.qbqu.qp.block;menu
22、();void cha nge()COUtVV 请输入要转化的逻辑地址,段号 S,段内页号 p,页内偏移地址d(B)e ndl;int snu m,p nu m,d num;cinsnum p num d num;/ 首先查快表if(snum二二qu.qb&pnum二二qu.qp)cout 快表命中对应块号是vvqu.qsvvendl;cout 该 块 中 作 业 数 据vvworkpagequ.qbqu.qp.block.strve ndl;cout 物理地址是st.sle n-1)cout 越界中断=O&ssnum v=st.sle n-1)/ 是否缺段cout 段表有效endl;if(s
23、sss nu m.flag=0)cout 缺段中断ssss nu m.ple n-1)menu();elseif(pnum=O&pnum v=ssss nu m.ple n-1)if(pagess nu mp nu m.flag=0)cout 缺页中断endl;menu();elseCOUt 找到该页查询页表后对应块号pagess nu mp nu m.blocke ndl;COUt 该块内存的数据是workpagess nu mp nu m.block.stre ndl;COut 转化得到的物理地址是:pagess nu mp nu m.block*bbs*1024+d num e ndl;menu();5、运行情况按提示操作,直至程序运行完毕,即可得结果。6、 流程图7、 心得体会通过这次实验,我懂得了存储管理分配和回收的一些简单算法的实现。 对于实验教师签名过程中遇到的问题,通过上网查找相关资料以及研读课本上的理论知识,都一一得 到了解决。同时,实验过程中我还掌握了用高级语言编写和调试管理程序的方法, 加深了对存储管理各种算法的概念及存储管理算法的理解,加深了对段页式存储管 理的地址转换的理解。多次实验下来最大的感受就是:实践出真知。只有把所学知 识付诸实践才能真正地掌握知识。优教师评价秀
copyright@ 2008-2022 冰豆网网站版权所有
经营许可证编号:鄂ICP备2022015515号-1