ImageVerifierCode 换一换
格式:DOCX , 页数:23 ,大小:201.37KB ,
资源ID:23882947      下载积分:3 金币
快捷下载
登录下载
邮箱/手机:
温馨提示:
快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。 如填写123,账号就是123,密码也是123。
特别说明:
请自助下载,系统不会自动发送文件的哦; 如果您已付费,想二次下载,请登录后访问:我的下载记录
支付方式: 支付宝    微信支付   
验证码:   换一换

加入VIP,免费下载
 

温馨提示:由于个人手机设置不同,如果发现不能下载,请复制以下地址【https://www.bdocx.com/down/23882947.html】到电脑端继续下载(重复下载不扣费)。

已注册用户请登录:
账号:
密码:
验证码:   换一换
  忘记密码?
三方登录: 微信登录   QQ登录  

下载须知

1: 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。
2: 试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。
3: 文件的所有权益归上传用户所有。
4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
5. 本站仅提供交流平台,并不能对任何下载内容负责。
6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。

版权提示 | 免责声明

本文(《操作系统》存储管理实验分析报告.docx)为本站会员(b****8)主动上传,冰豆网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知冰豆网(发送邮件至service@bdocx.com或直接QQ联系客服),我们立即给予删除!

《操作系统》存储管理实验分析报告.docx

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

2、动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。3、实验步骤(1)理解实验要求,联系所学知识; (2)根据要求编写调度算法; (3)编写完整的实验代码并在VC+

3、6.0环境下编译运行; (4)调试程序直至得出结果。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; /作业名int size; /作业

4、大小struct jcb* link; /链指针JCB;typedef 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;

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

6、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(假如

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 f

8、lag; 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=fr

9、ee_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.addre

10、ss=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(fr

11、ee_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) /*上邻非空闲区,下邻为空闲区,与下邻合并*/f

12、ree_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 mai

13、n( )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; /*其余空闲分区表项未被使用

14、*/*已分配表初始化:*/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回收主存空间

15、*/printf(输入要回收分区的作业名);scanf(%*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起始地址 分区长度 标志n);for(i=0

16、; 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;#include#includeusing namespace std;typedef struct

17、 Quick int qs;/快表段号 int qp;/快表页号 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;/段表寄存器

18、typedef struct Stare int ssta;/段表始址 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

19、段页式存储管理的地址转换的模拟程序endl; couttt*endl; 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;

20、 /switchvoid start() cout请输入内存大小(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个段表数据:段号,状态,页表长度

21、,页表始址ssss1.numssss1.flagssss1.plenssss1.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简单起见,我们对物理地址的每一块用字符串

22、进行简单的初始化,没有具体到每一物理地址endl; for (int 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();

23、void change() cout请输入要转化的逻辑地址,段号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) cout缺段中断ssssnum.plen-1) cout缺页中断=0&pnum=ssssnum.plen-1) if(pagessnumpnum.flag=0) cout缺页中断endl; menu(); else cout找到该页查询页表后对应块号pagessnumpnum.blockendl; cout该块内存

copyright@ 2008-2022 冰豆网网站版权所有

经营许可证编号:鄂ICP备2022015515号-1