操作系统存储管理实验报告.doc

上传人:叶*** 文档编号:35106602 上传时间:2022-08-20 格式:DOC 页数:15 大小:335.50KB
返回 下载 相关 举报
操作系统存储管理实验报告.doc_第1页
第1页 / 共15页
操作系统存储管理实验报告.doc_第2页
第2页 / 共15页
点击查看更多>>
资源描述

《操作系统存储管理实验报告.doc》由会员分享,可在线阅读,更多相关《操作系统存储管理实验报告.doc(15页珍藏版)》请在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+ 6.0环境下编译运行; (4)调试程序直至得出结果。4、 程序

3、清单#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; /作业名int size;/作业大小struct jcb* link; /链指针JCB;typ

4、edef structJCB *front,*rear;jcbQue;jcbQue *jcbReadyQue;void AllocateMemory(int size);void createTab();void checkTab();void recycleMemory(int i);void AllocateMemory(int size)int i;for(i=0;isize)parTabi.state=Y;elseprintf(没有空闲分区,无法分配内存!n);void createTab()int i;for( i=1;i=NUM;i+)/getPartiTab(PARTITAB);

5、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+)printf(%dt,parTabi.no);printf(%dt,parTabi.size);printf(%dt,parTabi.firstAddr);printf(%ct,parTabi.state);printf(n);void recycleMemory(int i)parTabi-1.state=N;int main

6、(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(假如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第

7、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 flag; used_tablen; structfloat ad

8、dress; 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=free_tablek.address;xk=free_tablek

9、.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.address=ad;used_tablei.length=xk;used

10、_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(free_tablei.address+free_tablei.le

11、ngth=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) /*上邻非空闲区,下邻为空闲区,与下邻合并*/free_tablej.address=S;free_tablej

12、.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 main( )printf(nntt*ttn);printf(tttt

13、实验三 存储管理实验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; /*其余空闲分区表项未被使用*/*已分配表初始化:*/for(i=0; in; i+)use

14、d_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回收主存空间*/printf(输入要回收分区的作业名);scanf(%*c%

15、c,&J);reclaim(J); /*回收主存空间*/break;case 1: /*a=1显示主存情况*/*输出空闲区表和已分配表的内容*/printf(输出空闲区表:n起始地址 分区长度 标志n);for(i=0; im; i+)printf(%6.0f%9.0f%6dn,free_tablei.address,free_tablei.length, free_tablei.flag);printf( 按任意键,输出已分配区表n);getch();printf( 输出已分配区表:n起始地址 分区长度 标志n);for(i=0; in; i+)if(used_tablei.flag!=0)

16、printf(%6.0f%9.0f%6cn,used_tablei.address,used_tablei.length, used_tablei.flag);elseprintf(%6.0f%9.0f%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;/快表段号 int qp;/快表页号

17、 int qb;/快表段号 Quick;typedef struct Data int num;/内存的块数 string str;/对应数据块的作业内容,简化起见说明内容为一串字符。 Data;/页表typedef struct Page int num;/页号 int flag;/页状态,即是否在内存。 int block;/该页对应的块号 Page;typedef struct Stack int num;/段号 int flag;/段状态 int plen;/页表长度 int psta;/页表始址 Stack;/段表寄存器typedef struct Stare int ssta;/段

18、表始址 int slen;/段表长度 Stare;Stack ss10;/全局变量Stare st;/全局变量Data work20;/全局变量Quick qu;/全局变量Page page55;bool menuflag=0;int bbs;/内存块大小int bs;/内存大小void menu();void start();void change();int main() menu(); return 0;void menu() coutnntt*ttendl; couttttt实验三 存储管理实验endl; coutnttt段页式存储管理的地址转换的模拟程序endl; couttt*en

19、dl; cout请选择:endl; coutendl; cout 1、初始化表 endl; cout 2、物理地址转换 endl; cout 3、退出 menu1; if(menu1!=1&menu1!=2&menu1!=3) cout请输入正确的选项endl; menu(); switch(menu1) case 1: menuflag=1; start(); break; case 2: if(menuflag=0) cout请初始化表endl; menu(); change(); break; case 3: return; /switchvoid start() cout请输入内存大小

20、(K)bs; cout请输入内存块的大小(k)bbs; int blocknum; blocknum=bs/bbs; cout内存一共被分为blocknum块,每块bbsk一共bskendl; cout请输入进程个数pn; /下面求所有进程的总段数和段表,并为每段创建页表 int sums=0; for (int pn1=0; pn1pn; pn1+) cout请输入第pn1个进程的段数ppn; sums+=ppn; for(int ss1=0; ss1sums; ss1+) cout请输入第ss1个段表数据:段号,状态,页表长度,页表始址ssss1.numssss1.flagssss1.pl

21、enssss1.psta; cout请初始化第ss1段的页表,输入两个数据页表状态和对应块号endl; for(int sss1=0; sss1ssss1.plen; sss1+) pagess1sss1.num=sss1; cout请输入该段第sss1个页表的页表状态和对应块号pagess1sss1.flagpagess1sss1.block; /初始化段表寄存器 cout初始化段表寄存器的段表始址st.ssta; st.slen=sums; /初始化内存中物理地址每一块的数据区 cout简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址endl; for (i

22、nt bn=0; bnblocknum; bn+) workbn.num=bn; cout请输入第bn个内存块里的作业内容workbn.str; /初始化快表 cout简单起见,我们初始化快表只有一个endl; cout请输入要作为快表的段号和页号qu.qbqu.qp; while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1) cout该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号qu.qbqu.qp; qu.qs=pagequ.qbqu.qp.block; menu();void change() cout请输入要转化的逻辑地址,段号

23、s,段内页号p,页内偏移地址d(B)snumpnumdnum; /首先查快表 if(snum=qu.qb&pnum=qu.qp) cout快表命中对应块号是qu.qsendl; cout该块中作业数据是workpagequ.qbqu.qp.block.strendl; cout物理地址是qu.qs*bbs*1024+dnumendl; menu(); /访问段表寄存器 else cout快表没有命中,访问段表寄存器,段号等于段表始址加上偏移地址st.slen-1) cout越界中断=0&ssnum=st.slen-1) /是否缺段 cout段表有效endl; if(ssssnum.flag=0

24、) cout缺段中断ssssnum.plen-1) cout缺页中断=0&pnum=ssssnum.plen-1) if(pagessnumpnum.flag=0) cout缺页中断endl; menu(); else cout找到该页查询页表后对应块号pagessnumpnum.blockendl; cout该块内存的数据是workpagessnumpnum.block.strendl; cout转化得到的物理地址是:pagessnumpnum.block*bbs*1024+dnumendl; menu(); 5、 运行情况 按提示操作,直至程序运行完毕,即可得结果。6、 流程图 7、 心得体会 通过这次实验,我懂得了存储管理分配和回收的一些简单算法的实现。对于实验过程中遇到的问题,通过上网查找相关资料以及研读课本上的理论知识,都一一得到了解决。同时,实验过程中我还掌握了用高级语言编写和调试管理程序的方法,加深了对存储管理各种算法的概念及存储管理算法的理解,加深了对段页式存储管理的地址转换的理解。多次实验下来最大的感受就是:实践出真知。只有把所学知识付诸实践才能真正地掌握知识。 教师评价优秀良好中等及格不及格教师签名日期

展开阅读全文
相关资源
相关搜索

当前位置:首页 > 教育专区 > 高中资料

本站为文档C TO C交易模式,本站只提供存储空间、用户上传的文档直接被用户下载,本站只是中间服务平台,本站所有文档下载所得的收益归上传人(含作者)所有。本站仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。若文档所含内容侵犯了您的版权或隐私,请立即通知淘文阁网,我们立即给予删除!客服QQ:136780468 微信:18945177775 电话:18904686070

工信部备案号:黑ICP备15003705号© 2020-2023 www.taowenge.com 淘文阁