欢迎来到淘文阁 - 分享文档赚钱的网站! | 帮助中心 好文档才是您的得力助手!
淘文阁 - 分享文档赚钱的网站
全部分类
  • 研究报告>
  • 管理文献>
  • 标准材料>
  • 技术资料>
  • 教育专区>
  • 应用文书>
  • 生活休闲>
  • 考试试题>
  • pptx模板>
  • 工商注册>
  • 期刊短文>
  • 图片设计>
  • ImageVerifierCode 换一换

    最新《操作系统》存储管理实验报告要点.doc

    • 资源ID:48051271       资源大小:448KB        全文页数:88页
    • 资源格式: DOC        下载积分:15金币
    快捷下载 游客一键下载
    会员登录下载
    微信登录下载
    三方登录下载: 微信开放平台登录   QQ登录  
    二维码
    微信扫一扫登录
    下载资源需要15金币
    邮箱/手机:
    温馨提示:
    快捷下载时,用户名和密码都是您填写的邮箱或者手机号,方便查询和重复下载(系统自动生成)。
    如填写123,账号就是123,密码也是123。
    支付方式: 支付宝    微信支付   
    验证码:   换一换

     
    账号:
    密码:
    验证码:   换一换
      忘记密码?
        
    友情提示
    2、PDF文件下载后,可能会被浏览器默认打开,此种情况可以点击浏览器菜单,保存网页到桌面,就可以正常下载了。
    3、本站不支持迅雷下载,请使用电脑自带的IE浏览器,或者360浏览器、谷歌浏览器下载即可。
    4、本站资源下载后的文档和图纸-无水印,预览文档经过压缩,下载后原文更清晰。
    5、试题试卷类文档,如果标题没有明确说明有答案则都视为没有答案,请知晓。

    最新《操作系统》存储管理实验报告要点.doc

    Four short words sum up what has lifted most successful individuals above the crowd: a little bit more.-author-date操作系统存储管理实验报告要点acer_大学_学院实验报告课程名称: 计算机操作系统 实验名称: 存储管理实验 实验日期: 班级: 姓名: 学号: 仪器编号: XX 实验报告要求:1.实验目的 2.实验要求 3.实验步骤 4.程序清单 5.运行情况 6.流程图 7.实验体会1、 实验目的 通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解,熟悉虚存管理的各种页面淘汰法。 通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。2、 实验要求设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。设计一个可变式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一:首次适应算法;最坏适应算法;最佳适应算法。编写并调试一个段页式存储管理的地址转换的模拟程序。首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。3、 实验步骤(1) 理解实验要求,联系所学知识; (2)根据要求编写调度算法; (3)编写完整的实验代码并在VC+ 6.0环境下编译运行; (4)调试程序直至得出结果。4、 程序清单#include <stdio.h>#include <stdio.h>#include<math.h>#include<stdlib.h>#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;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;i<NUM;i+)PARTITAB p=parTabi;if(p.state='N' && p.size>size)parTabi.state='Y'elseprintf("没有空闲分区,无法分配内存!n");void createTab()int i;for( i=1;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;i<NUM;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(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;i<NUM;i+)AllocateMemory(i+1)*3);checkTab();printf("请按任意键继续:n");getchar();printf("假如一段时间后,其中一个作业结束,回收给它分配的分区(假如该作业在第2分区)n");recycleMemory(2);checkTab();printf("请按任意键继续:n");getchar();printf("接着,从外存后备作业队列中选择一个作业装入该分区(假如该作业大小为10)n");AllocateMemory(10);checkTab();return 0;#include<stdio.h>#include <dos.h>#include<stdlib.h>#include<conio.h>#define n 10 #define m 10 #define minisize 100 structfloat address; float length; int 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<m; i+)if(free_tablei.length>=xk&&free_tablei.flag=1)if(k=-1|free_tablei.length<free_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.length;elsefree_tablek.length=free_tablek.length-xk;ad=free_tablek.address+free_tablek.length;i=0;while(used_tablei.flag!=0&&i<n) i+;if(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_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)s+;if(s>=n) printf("找不到该作业n");return;used_tables.flag=0;S=used_tables.address;L=used_tables.length;j=-1;k=-1;i=0;while(i<m&&(j=-1|k=-1)if(free_tablei.flag=1)if(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) /*上邻非空闲区,下邻为空闲区,与下邻合并*/free_tablej.address=S;free_tablej.length=free_tablej.length+L;else /*上下邻均为非空闲区,回收区域直接填入*/*在空闲区表中寻找空栏目*/t=0;while(free_tablet.flag=1&&t<m)t+;if(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实验三 存储管理实验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; i<m; i+)free_tablei.flag=0; /*其余空闲分区表项未被使用*/*已分配表初始化:*/for(i=0; i<n; 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回收主存空间*/printf("输入要回收分区的作业名");scanf("%*c%c",&J);reclaim(J); /*回收主存空间*/break;case 1: /*a=1显示主存情况*/*输出空闲区表和已分配表的内容*/printf("输出空闲区表:n起始地址 分区长度 标志n");for(i=0; i<m; 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; i<n; 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<iostream>#include<string>using namespace std;typedef struct 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;/段表寄存器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() cout<<"nntt*tt"<<endl; cout<<"tttt实验三 存储管理实验"<<endl; cout<<"nttt段页式存储管理的地址转换的模拟程序"<<endl; cout<<"tt*"<<endl; cout<<"请选择:"<<endl; cout<<endl; cout<<" 1、初始化表 "<<endl; cout<<" 2、物理地址转换 "<<endl; cout<<" 3、退出 "<<endl; int menu1; cin>>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<<"请输入内存大小(K)"<<endl; cin>>bs; cout<<"请输入内存块的大小(k)"<<endl; cin>>bbs; int blocknum; blocknum=bs/bbs; cout<<"内存一共被分为"<<blocknum<<"块,每块"<<bbs<<"k"<<"一共"<<bs<<"k"<<endl; cout<<"请输入进程个数"<<endl; int pn; cin>>pn; /下面求所有进程的总段数和段表,并为每段创建页表 int sums=0; for (int pn1=0; pn1<pn; pn1+) cout<<"请输入第"<<pn1<<"个进程的段数"<<endl; int ppn; cin>>ppn; sums+=ppn; for(int ss1=0; ss1<sums; ss1+) cout<<"请输入第"<<ss1<<"个段表数据:段号,状态,页表长度,页表始址"<<endl; cin>>ssss1.num>>ssss1.flag>>ssss1.plen>>ssss1.psta; cout<<"请初始化第"<<ss1<<"段的页表,输入两个数据页表状态和对应块号"<<endl; for(int sss1=0; sss1<ssss1.plen; sss1+) pagess1sss1.num=sss1; cout<<"请输入该段第"<<sss1<<"个页表的页表状态和对应块号"<<endl; cin>>pagess1sss1.flag>>pagess1sss1.block; /初始化段表寄存器 cout<<"初始化段表寄存器的段表始址"<<endl; cin>>st.ssta; st.slen=sums; /初始化内存中物理地址每一块的数据区 cout<<"简单起见,我们对物理地址的每一块用字符串进行简单的初始化,没有具体到每一物理地址"<<endl; for (int bn=0; bn<blocknum; bn+) workbn.num=bn; cout<<"请输入第"<<bn<<"个内存块里的作业内容"<<endl; cin>>workbn.str; /初始化快表 cout<<"简单起见,我们初始化快表只有一个"<<endl; cout<<"请输入要作为快表的段号和页号"<<endl; cin>>qu.qb>>qu.qp; while(ssqu.qb.flag!=1|pagequ.qbqu.qp.flag!=1) cout<<"该页不在内存请输入一页在内存中的作为快表,请输入要作为快表的段号和页号"<<endl; cin>>qu.qb>>qu.qp; qu.qs=pagequ.qbqu.qp.block; menu();void change() cout<<"请输入要转化的逻辑地址,段号s,段内页号p,页内偏移地址d(B)"<<endl; int snum,pnum,dnum; cin>>snum>>pnum>>dnum; /首先查快表 if(snum=qu.qb&&pnum=qu.qp) cout<<"快表命中"<<"对应块号是"<<qu.qs<<endl; cout<<"该块中作业数据是"<<workpagequ.qbqu.qp.block.str<<endl; cout<<"物理地址是"<<qu.qs*bbs*1024+dnum<<endl; menu(); /访问段表寄存器 else cout<<"快表没有命中,访问段表寄存器,段号等于段表始址加上偏移地址"<<endl; int ssnum; ssnum=st.ssta+snum; if(ssnum>st.slen-1) cout<<"越界中断"<<endl; menu(); /访问段表 else if(ssnum>=0&&ssnum<=st.slen-1) /是否缺段 cout<<"段表有效"<<endl; if(ssssnum.flag=0) cout<<"缺段中断"<<endl; menu(); else /查询页表,根据段号查出页表始址,加上段内偏移页数,即得到页表项。 /缺页中断测试 if(pnum>ssssnum.plen-1) cout<<"缺页中断"<<endl; menu(); else if(pnum>=0&&pnum<=ssssnum.plen-1) if(pagessnumpnum.flag=0) cout<<"缺页中断"<<endl; menu(); else cout<<"找到该页"<<"查询页表后对应块号"<<pagessnumpnum.block<<endl; cout<<"该块内存的数据是"<<workpagessnumpnum.block.str<<endl; cout<<"转化得到的物理地址是:"<<pagessnumpnum.block*bbs*1024+dnum<<endl; menu(); 5、 运行情况 按提示操作,直至程序运行完毕,即可得结果。6、 流程图 7、 心得体会 通过这次实验,我懂得了存储管理分配和回收的一些简单算法的实现。对于实验过程中遇到的问题,通过上网查找相关资料以及研读课本上的理论知识,都一一得到了解决。同时,实验过程中我还掌握了用高级语言编写和调试管理程序的方法,加深了对存储管理各种算法的概念及存储管理算法的理解,加深了对段页式存储管理的地址转换的理解。多次实验下来最大的感受就是:实践出真知。只有把所学知识付诸实践才能真正地掌握知识。 教师评价优秀良好中等及格不及格教师签名日期-

    注意事项

    本文(最新《操作系统》存储管理实验报告要点.doc)为本站会员(1595****071)主动上传,淘文阁 - 分享文档赚钱的网站仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对上载内容本身不做任何修改或编辑。 若此文所含内容侵犯了您的版权或隐私,请立即通知淘文阁 - 分享文档赚钱的网站(点击联系客服),我们立即给予删除!

    温馨提示:如果因为网速或其他原因下载失败请重新下载,重复下载不扣分。




    关于淘文阁 - 版权申诉 - 用户使用规则 - 积分规则 - 联系我们

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

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

    收起
    展开