




免费预览已结束,剩余22页可下载查看
下载本文档
版权说明:本文档由用户提供并上传,收益归属内容提供方,若内容存在侵权,请进行举报或认领
文档简介
实验三 存储管理实验一. 目的要求: 1、通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。2、通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。 二 . 例题 设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列,使得 50的指令是顺序执行的。25的指令均匀地散布在前地址部分,25的地址是均匀地散布在后地址部分。 为简单起见。页面淘汰算法采用 FIFO页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。 具体的做法可以是: 产生一个需要访问的指令地址流; 指令合适的页面尺寸(例如以 1K或2K为1页); 指定内存页表的最大长度,并对页表进行初始化; 每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页,打印页表情况;逐个地址访问,直到所有地址访问完毕。存储管理算法的流程图如下:三 . 实验题: 1、设计一个固定式分区分配的存储管理方案,并模拟实现分区的分配和回收过程。 可以假定每个作业都是批处理作业,并且不允许动态申请内存。为实现分区的分配和回收,可以设定一个分区说明表,按照表中的有关信息进行分配,并根据分区的分配和回收情况修改该表。#include #include #include#include#define NUM 4#define alloMemory(type) (type*)malloc(sizeof(type)struct partiTab int no; int size; int firstAddr; char state; parTabNUM;typedef struct partiTab PARTITAB;typedef struct jcb char name10; int size; struct jcb* link; JCB;typedef struct JCB *front,*rear; jcbQue;jcbQue *jcbReadyQue;void AllocateMemory(int size);void createTab();void checkTab();void recycleMemory(int i);void AllocateMemory(int size) int i; int n=0; for(i=0; isize) parTabi.state=Y; n=1; break; if (n=0) printf(内存大小是%dt,size); printf(无法分配内存!n); else printf(内存大小是%dt,size); printf(装入内存成功!n); void createTab() parTab0.no=0; parTab0.size=12; parTab0.firstAddr=20; parTab0.state=N; parTab1.no=1; parTab1.size=32; parTab1.firstAddr=32; parTab1.state=N; parTab2.no=2; parTab2.size=64; parTab2.firstAddr=64; parTab2.state=N; parTab3.no=3; parTab3.size=128; parTab3.firstAddr=128; parTab3.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(int argc, char* argv) int i; int k=1+rand()%100; printf(*固定式分区分配存储管理*n); createTab(); checkTab(); printf(请按任意键继续:n); getchar(); printf(一次装入多个作业:n); for(i=0; iNUM; i+) AllocateMemory(k); k=1+rand()%100; checkTab(); printf(请按任意键继续:n); getchar(); printf(若继续装入作业n); k=1+rand()%100; AllocateMemory(k); checkTab(); printf(请按任意键继续:n); getchar(); printf(若有一个作业完成n); k=rand()%4; recycleMemory(2); checkTab(); printf(继续装入作业n); k=1+rand()%100; AllocateMemory(k); checkTab(); return 0;截图显示为:2、设计一个可变式分区分配的存储管理方案。并模拟实现分区的分配和回收过程。 对分区的管理法可以是下面三种算法之一: 首次适应算法 循环首次适应算法 最佳适应算法 #include#include #include#include#define n 10#define m 10#define minisize 100structfloat 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=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.length; else free_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_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.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) printf(主存空闲表没有空间,回收空间失败n); used_tables.flag=J; return; free_tablet.address=S; free_tablet.length=L; free_tablet.flag=1; return;int main( ) int i,a,b=4; float xk; char J; free_table0.address=10240; free_table0.length=10240; free_table0.flag=1; for(i=1;im;i+) free_tablei.flag=0; for(i=0;in;i+) used_tablei.flag=0; while(b=4) printf(请选择功能项:n); printf(0、退出!n); printf(1、分配主存!n); printf(2、回收主存!n); printf(3、显示主存! n); printf(选择功项(03) :n); scanf(%d,&a); switch(a) case 0: exit(0); case 1: printf(输入作业名 作业所需长度: ); scanf(%*c%c%f,&J,&xk); allocate(J,xk); break; case 2: printf(输入要回收分区的作业名); scanf(%*c%c,&J); reclaim(J); break; case 3: 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) printf(%6.0f%9.0f%6cn,used_tablei.address,used_tablei.length, used_tablei.flag); else printf(%6.0f%9.0f%6dn,used_tablei.address,used_tablei.length, used_tablei.flag); break; default:printf(没有该选项n); break; return 0;截图得:3、编写并调试一个段页式存储管理的地址转换的模拟程序。 首先设计好段表、页表,然后给出若干个有一定代表性的地址,通过查找段表页表后得到转换的地址。 要求打印转换前的地址,相应的段表,页表条款及转换后的地址,以便检查。#include#includeusing 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();void menu() cout 段页式存储管理的地址转换的模拟程序endl; cout请选择相应的序号:endl; 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请输入内存大小(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.plenssss1.psta; cout请初始化第ss1段的页表.endl; for(int sss1=0; sss1ssss1.plen; sss1+) pagess1sss1.num=sss1; cout请输入该页表第sss1个页表项的页号、页表状态和对应块号pagess1sss1.numpagess1sss1.flagpagess1sss1.block; cout初始化段表寄存器的段表始址st.ssta; st.slen=sums; cout我们对物理地址的每一块用字符串进行简单的初始化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();void change() cout请输入要转化的逻辑地址,段号,段内页号,页内偏移地址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该块内存的数据是workpagessnumpnum.block.strendl; cout转化得到的物理地址是:pagessnumpnum.block*bbs*1024+dnumendl; menu(); cout此时将此项内容添加到快表里面endl; int main() menu(); return 0;截图可以得到:四实验总结这次的实验对于我来说还是比较难的,几乎每次都是这样
温馨提示
- 1. 本站所有资源如无特殊说明,都需要本地电脑安装OFFICE2007和PDF阅读器。图纸软件为CAD,CAXA,PROE,UG,SolidWorks等.压缩文件请下载最新的WinRAR软件解压。
- 2. 本站的文档不包含任何第三方提供的附件图纸等,如果需要附件,请联系上传者。文件的所有权益归上传用户所有。
- 3. 本站RAR压缩包中若带图纸,网页内容里面会有图纸预览,若没有图纸预览就没有图纸。
- 4. 未经权益所有人同意不得将文件中的内容挪作商业或盈利用途。
- 5. 人人文库网仅提供信息存储空间,仅对用户上传内容的表现方式做保护处理,对用户上传分享的文档内容本身不做任何修改或编辑,并不能对任何下载内容负责。
- 6. 下载文件中如有侵权或不适当内容,请与我们联系,我们立即纠正。
- 7. 本站不保证下载资源的准确性、安全性和完整性, 同时也不承担用户因使用这些下载资源对自己和他人造成任何形式的伤害或损失。
最新文档
- 中小微企业合同工就业机会:吸纳就业补贴详解
- 企业聘用临时工劳动合同协议
- 灯具产品测试与认证流程考核试卷
- 生物质能源的化学利用考核试卷
- 2024年04月甘肃酒泉市卫生健康系统事业单位校园招聘246人笔试历年专业考点(难、易错点)附带答案详解
- 物联网在水质监测中的应用考核试卷
- 女式服装搭配培训方案
- 皮革制品超声波粘接技术优化考核试卷
- 小学数学人教版(2024)四年级上册笔算除法第二课时教学设计
- 介入血管外科培训课件
- 精装修算量与计价学习总结课件
- 《森林培育学》第一章 人工林概述
- FZTG型防提装置使用说明书
- 包头保利拉菲公馆地产营销策略提案
- 心脏的胚胎发育与先天性心脏病课件
- 钢结构施工组织设计方案
- 煤矿安全生产重点检查表
- YY/T 1421-2016载脂蛋白B测定试剂盒
- YS/T 1161.1-2016拟薄水铝石分析方法第1部分:胶溶指数的测定EDTA容量法
- GB/T 6678-2003化工产品采样总则
- GB/T 5121.1-2008铜及铜合金化学分析方法第1部分:铜含量的测定
评论
0/150
提交评论