《操作系统》存储管理实验报告分析_第1页
《操作系统》存储管理实验报告分析_第2页
《操作系统》存储管理实验报告分析_第3页
《操作系统》存储管理实验报告分析_第4页
《操作系统》存储管理实验报告分析_第5页
已阅读5页,还剩12页未读 继续免费阅读

付费下载

下载本文档

版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领

文档简介

1、大学学院实验报告课程名称:计算机操作系统实验名称:存储管理实验 实验日期:班级: 姓名: 学号: 仪器编号:XX实验报告要求:1实验目的2实验要求 3实验步骤4.程序清单5运行情况6流程图7实验体会1实验目的通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。2、实验要求设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情

2、况修改该表。设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。3、实验步骤(1)理解实验要求,联系所学知识;(2)根据要求编写调度算法;(3)编写完整的实验代码并在VC+ 6.0环境下编译运行;(4)调试程序直至得出结果。4、程序清单#i nclude #i nclude #in clude

3、#in clude#defi ne NUM 4#defi ne 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;typedef structJCB *fron t,

4、*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=0;isize)parTabi.state=Y;elseprintf(”没有空闲分区,无法分配内存!n);void createTab()int i;for( i=1;i=NUM;i+)/getPartiTab(PARTITAB);parTabi-1. no=i; p

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

6、nt argc, char* argv)int i;printf(nntt*ttn); printf(tttt 实验一存储管理实验n);prin tf(tttt固定式分区分配存储管理n ”);prin tf(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;#in clude#in elude #in clude#in clude#defi ne n 10#defi ne m 10#defi ne mini size 100structfloat address;float le ngth;int flag;used_table n;st

8、ructfloat address;float le ngth;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.le ngthfree_tablek.le ngth) k=i;if(k=-1)printf(”无可用空闲区n”);return; if(free_tablek.le ngth-xk=mi nisize)free_tablek.flag=0;ad=free_tablek.addre

9、ss;xk=free_tablek.le ngth;elsefree_tablek.le ngth=free_tablek.le ngth-xk; ad=free_tablek.address+free_tablek.le ngth; i=0;while(used_tablei.flag!=O&i=n)printf(无表目填写已分分区,错误n);if(free_tablek.flag=O)free_tablek.flag=1;elsefree_tablek.le ngth=free_tablek.le ngth+xk;return;elseused_tablei.address=ad;used

10、_tablei.le ngth=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=O)&s=n)printf(找不到该作业n”);return;used_tables.flag=0;S=used_tables.address;L=used_tables.le ngth;j=-1;k=-1;i=0;while(im &(j=-1|k=-1)if(free_tablei.flag=1)if(free_table

11、i.address+free_tablei.le ngth=S)k=i; if(free_tablei.address=S+L)j=i;i+;if(k!=-1)if(j!=-1)/*上邻空闲区,下邻空闲区,三项合并*/free_tablek.le ngth=free_tablej.le ngth+free_tablek .len gth+L; free_tablej.flag=0;else/*上邻空闲区,下邻非空闲区,与上邻合并*/free_tablek.le ngth=free_tablek.le ngth+L;else if(j!=-1)/*上邻非空闲区,下邻为空闲区,与下邻合并*/fre

12、e_tablej.address=S;free_tablej.le ngth=free_tablej.le ngth+L;else/*上下邻均为非空闲区,回收区域直接填入*/*在空闲区表中寻找空栏目*/t=0;while(free_tablet.flag=1 &t=m) /*空闲区表满,回收空间失败,将已分配表复原*/printf(主存空闲表没有空间,回收空间失败n);used_tables.flag=J;return; free_tablet.address=S;free_tablet.le ngth=L; free_tablet.flag=1; return;/*主存回收函数结束*/ in

13、t main() printf(nntt*ttn);printf(tttt 实验三存储管理实验n);printf(nttt可变式分区分配(最佳适应算法)n);prin tf(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;/*其余

14、空闲分区表项未被使用*/*已分配表初始化:*/for(i=0; in; i+)used_tablei.flag=0; /* 初始时均未分配 */while(1)printf(功能选择项:n1。显示主存n2。分配主存n3。回收主存n4。退出n); printf(请选择相应功能1-4 :”);sca nf(%d,&a);switch(a)case 4:exit(0); /*a=4 程序结束 */case 2:/*a=2分配主存空间*/printf(输入作业名J和作业所需空间xk:);sca nf(%*c%c%f, &J, &xk);allocate(J,xk); /* 分配主存空间 */break

15、;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+)printf(%6.0f%9.0f%6dn,free_tablei.address,free_tablei.length, free_tablei.flag);printf(按任意键,输出已分配区表n);getch();printf(输出已分配区表:n起始地址

16、分区长度 标志n);for(i=0; in; i+)if(used_tablei.flag!=0)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;#in clude#in cludeusing n ames

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

18、ack;/段表寄存器typedef struct Stareint ssta;/段表始址 int slen;段表长度 Stare;Stack ss10;/ 全局变量 Stare st;/ 全局变量 Data work20; 全局变量 Quick qu;/ 全局变量 Page page5 5;bool menu flag=0;int bbs;/内存块大小 int bs;/内存大小void menu();void start(); void cha nge();int mai n()menu();return 0;void menu()coutnntt*tte ndl;couttttt 实验三 存

19、储管理实验endl; coutnttt段页式存储管理的地址转换的模拟程序e ndl;couttt*e ndl;cout请选择:endl; coute ndl;cout1、初始化表e ndl;cout2、物理地址转换e ndl;cout3、退出e ndl;int men u1;cinmen u1;if(me nu1!=1 &men u1!=2&men u1!=3)cout请输入正确的选项endl; menu();switch(me nu1)case 1:menu flag=1; start(); break;case 2:if(me nu flag=O)cout请初始化表endl;men u()

20、;cha nge();break;case 3:return;/switchvoid start()cout请输入内存大小(K) bs;cout请输入内存块的大小 (k) bbs;int block num;block num=bs/bbs;cout内存一共被分为blocknum块,每块bbsk 共bskendl;cout请输入进程个数endl;int pn;cinpn;/下面求所有进程的总段数和段表,并为每段创建页表int sums=0;for (int pn 1=0; pn 1p n; pn 1+)cout请输入第pn1个进程的段数 pp n;sums+=pp n;for(i nt ss1

21、=0; ss1sums; ss1+)cout请输入第ss1个段表数据:段号,状态,页表长度,页表始址 ssss1. num ssss1.flagssss1.ple n ssss1.psta;cout请初始化第ss1段的页表,输入两个数据页表状态和对应块号endl;for(int sss1=0; sss1ssss1.plen; sss1+)pagess1sss1. num=sss1;cout请输入该段第sss1个页表的页表状态和对应块号 pagess1sss1.flagpagess1sss1.block;/初始化段表寄存器cout初始化段表寄存器的段表始址 st.ssta;st.sle n=su

22、ms;/初始化内存中物理地址每一块的数据区cout简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址e ndl;for (int bn=0; bn block num; bn+)workb n. num=bn;cout请输入第bn个内存块里的作业内容 workb n.str;/初始化快表cout简单起见,我们初始化快表只有一个e ndl;cout请输入要作为快表的段号和页号e ndl;cinq u.qbqu.qp;while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1)cout该页不在内存请输入一页在内存中的作为快表,请输入要作为

23、快表的段号和页号e ndl;cinq u.qbqu.qp;qu.qs=pagequ.qbqu.qp.block;menu();void cha nge()cout请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B)p num d num;/首先查快表if(snum=qu.qb&pnum=qu.qp)cout快表命中对应块号是qu.qsendl;cout该块中作业数据是workpagequ.qbqu.qp.block.stre ndl;cout物理地址是qu.qs*bbs*1024+dnumendl;menu();/访问段表寄存器elsecout快表没有命中,访问段表寄存器,段号等于

24、段表始址加上偏移地址st.sle n-1)cout越界中断=O&ssnum =st.sle n-1)/是否缺段cout段表有效endl;if(ssss nu m.flag=O)cout缺段中断ssss nu m.ple n-1)cout缺页中断=O&pnum =ssss nu m.ple n-1)if(pagess nu mp nu m.flag=O)cout缺页中断endl;men u();elsecout 找到该页查询页表后对应块号pagess nu mp nu m.blocke ndl;cout该 块内 存 的 数 据 是workpagess nu mp nu m.block.stre ndl;是cout 转化 得到 的 物 理地 址pagess nu mp nu m.b

温馨提示

  • 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
  • 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
  • 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
  • 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
  • 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
  • 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
  • 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

评论

0/150

提交评论