《操作系统存储管理实验报告.docx》由会员分享,可在线阅读,更多相关《操作系统存储管理实验报告.docx(18页珍藏版)》请在taowenge.com淘文阁网|工程机械CAD图纸|机械工程制图|CAD装配图下载|SolidWorks_CaTia_CAD_UG_PROE_设计图分享下载上搜索。
1、精选优质文档-倾情为你奉上_大学_学院实验报告课程名称: 计算机操作系统 实验名称: 存储管理实验 实验日期: 班级: 姓名: 学号: 仪器编号: XX 实验报告要求:1.实验目的 2.实验要求 3.实验步骤 4.程序清单 5.运行情况 6.流程图 7.实验体会1、 实验目的 ?通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。 ?通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。2、 实验要求?设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回
2、收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。?设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。?编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。3、 实验步骤(1) 理解实验要求,联系所学知识; (2)根据要求编写调度算法; (3)编写完整的实验代码并在VC+ 环境下编译运行; (4)调
3、试程序直至得出结果。4、 程序清单?#include #include #include#include#define 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; tate=Y;elseprintf(没有空闲分区,无法分配内存
4、!n);void createTab()int i;for( i=1;i=NUM;i+)o=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+)printf(%dt,parTabi.no);printf(%dt,parTabi.size);printf(%dt,parTabi.firstAddr);printf(%ct,parTabi.state);printf(n);void recycleMemory
5、(int i)parTabi-1.state=N;int main(int argc, char* argv)int i;printf(nntt*ttn);printf(tttt实验一 存储管理实验n);printf(tttt固定式分区分配存储管理n);printf(tt*ttn);createTab();checkTab();printf(请按任意键继续:n);getchar();printf(每个分区装入一道作业:n);for(i=0;iNUM;i+)AllocateMemory(i+1)*3);checkTab();printf(请按任意键继续:n);getchar();printf(假
6、如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第2分区)n);recycleMemory(2);checkTab();printf(请按任意键继续:n);getchar();printf(接着,从外存后备作业队列中选择一个作业装入该分区(假如该作业大小为10)n);AllocateMemory(10);checkTab();return 0;?#include#include #include#include#define n 10 #define m 10 #define minisize 100 structfloat address; float length; int
7、 flag; used_tablen; structfloat address; float length; int flag; free_tablem;void 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_tablei.lengthfree_tablek.length)k=i;if(k=-1) printf(无可用空闲区n);return;if(free_tablek.length-xk=minisize)free_tablek.flag=0;ad=
8、free_tablek.address;xk=free_tablek.length;elsefree_tablek.length=free_tablek.length-xk;ad=free_tablek.address+free_tablek.length;i=0;while(used_tablei.flag!=0&i=n) printf(无表目填写已分分区,错误n);if(free_tablek.flag=0)free_tablek.flag=1;else free_tablek.length=free_tablek.length+xk;return;else used_tablei.add
9、ress=ad;used_tablei.length=xk;used_tablei.flag=J;return;void reclaim(char J) 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=0;S=used_tables.address;L=used_tables.length;j=-1;k=-1;i=0;while(im&(j=-1|k=-1)if(free_tablei.flag=1)if(
10、free_tablei.address+free_tablei.length=S)k=i;if(free_tablei.address=S+L)j=i;i+;if(k!=-1)if(j!=-1) /* 上邻空闲区,下邻空闲区,三项合并*/free_tablek.length=free_tablej.length+free_tablek.length+L;free_tablej.flag=0;else/*上邻空闲区,下邻非空闲区,与上邻合并*/free_tablek.length=free_tablek.length+L;else if(j!=-1) /*上邻非空闲区,下邻为空闲区,与下邻合并*
11、/free_tablej.address=S;free_tablej.length=free_tablej.length+L;else /*上下邻均为非空闲区,回收区域直接填入*/*在空闲区表中寻找空栏目*/t=0;while(free_tablet.flag=1&t=m) /*空闲区表满,回收空间失败,将已分配表复原*/printf(主存空闲表没有空间,回收空间失败n);used_tables.flag=J;return;free_tablet.address=S;free_tablet.length=L;free_tablet.flag=1;return;/*主存回收函数结束*/int m
12、ain( )printf(nntt*ttn);printf(tttt实验三 存储管理实验n);printf(nttt可变式分区分配 (最佳适应算法)n);printf(tt*n);int i,a;float xk;char J;/*空闲分区表初始化:*/free_table0.address=10240; /*起始地址假定为10240*/free_table0.length=10240; /*长度假定为10240,即10k*/free_table0.flag=1; /*初始空闲区为一个整体空闲区*/for(i=1; im; i+)free_tablei.flag=0; /*其余空闲分区表项未被
13、使用*/*已分配表初始化:*/for(i=0; in; i+)used_tablei.flag=0; /*初始时均未分配*/while(1)printf(功能选择项:n1。显示主存n2。分配主存n3。回收主存n4。退出n);printf(请选择相应功能1-4 :);scanf(%d,&a);switch(a)case 4:exit(0); /*a=4程序结束*/case 2: /*a=2分配主存空间*/printf(输入作业名J和作业所需空间xk: );scanf(%*c%c%f,&J,&xk);allocate(J,xk); /*分配主存空间*/break;case 3: /*a=3回收主存
14、空间*/printf(输入要回收分区的作业名);scanf(%*c%c,&J);reclaim(J); /*回收主存空间*/break;case 1: /*a=1显示主存情况*/*输出空闲区表和已分配表的内容*/printf(输出空闲区表:n起始地址 分区长度 标志n);for(i=0; im; i+)printf(%6dn,free_tablei.address,free_tablei.length, free_tablei.flag);printf( 按任意键,输出已分配区表n);getch();printf( 输出已分配区表:n起始地址 分区长度 标志n);for(i=0; in; i+
15、)if(used_tablei.flag!=0)printf(%6cn,used_tablei.address,used_tablei.length, used_tablei.flag);elseprintf(%6dn,used_tablei.address,used_tablei.length, used_tablei.flag);break;default:printf(没有该选项n);/*case*/*while*/return 1;?#include#includeusing namespace std;typedef struct Quick int qs;umssss1.flags
16、sss1.plenssss1.psta; cout请初始化第ss1段的页表,输入两个数据页表状态和对应块号endl; for(int sss1=0; sss1ssss1.plen; sss1+) pagess1sss1.num=sss1; cout请输入该段第sss1个页表的页表状态和对应块号pagess1sss1.flagpagess1sss1.block; um=bn; cout请输入第bn个内存块里的作业内容workbn.str; lag!=1|page.flag!=1) cout该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号; =page.block; menu
17、();void change() cout请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B)snumpnumdnum; lock.strendl; cout物理地址是*bbs*1024+dnumendl; menu(); lag=0) cout缺段中断endl; menu(); else len-1) cout缺页中断=0&pnum=ssssnum.plen-1) if(pagessnumpnum.flag=0) cout缺页中断endl; menu(); else cout找到该页查询页表后对应块号pagessnumpnum.blockendl; cout该块内存的数据是wor
18、kpagessnumpnum.block.strendl; cout转化得到的物理地址是:pagessnumpnum.block*bbs*1024+dnumendl; menu(); 5、 运行情况 ? ?按提示操作,直至程序运行完毕,即可得结果。6、 流程图7、 心得体会 通过这次实验,我懂得了存储管理分配和回收的一些简单算法的实现。对于实验过程中遇到的问题,通过上网查找相关资料以及研读课本上的理论知识,都一一得到了解决。同时,实验过程中我还掌握了用高级语言编写和调试管理程序的方法,加深了对存储管理各种算法的概念及存储管理算法的理解,加深了对段页式存储管理的地址转换的理解。多次实验下来最大的感受就是:实践出真知。只有把所学知识付诸实践才能真正地掌握知识。教师评价优秀良好中等及格不及格教师签名日期专心-专注-专业