操作系统实验报告3-虚拟存储_第1页
操作系统实验报告3-虚拟存储_第2页
操作系统实验报告3-虚拟存储_第3页
操作系统实验报告3-虚拟存储_第4页
操作系统实验报告3-虚拟存储_第5页
已阅读5页,还剩9页未读 继续免费阅读

付费下载

下载本文档

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

文档简介

计师101徐翼飞1013012015虚拟存储器管理1.实验目的模拟请求分页虚拟存储器管理技术中的硬件地址变换。缺页中断以及页式淘汰算法,处理缺页中断。2.实验内容1.模拟请求分页存储管理中的硬件地址变换的过程2.

采用先进先出算法实现分页管理的缺页调度3.1数据结构设计

1)创建结构体page为进程的页表structpage{ inti;//页号 intflag;//有效位 intnumber;//主存块号 longaddress;//外存地址 intchange;//修改位};2)定义结构体order为存储指令structorder{ charp[10]; inti1;//页号 intoffset;//偏移量};、3)定义数组p用来存放空闲进程块的信息int*p=newint[n];4)定义类processclassprocess{private: page*a; intM;//数组的长度 int*p; intN;//页表的长度 inthead; int*spare;public: process()//构造函数 {} ~process()//析构函数 { } voidoperate(order*s)//分页存储管理{}intFIFO(inti)//先进先出算法{}voidshow()//输出显示{}}3.3算法设计i)构造函数对所有变量初始化step1::输入进程的页数 cin>>n; a=newpage[n];//定义为该进程存储的页表 N=n;//页表的长度 step2: 初始化页表项 a[i].i=i; a[i].flag=0; a[i].number=-1; a[i].address=11+i; a[i].change=0; step3:输入进程空闲块的数目 cin>>n; M=n;//主存中空闲的块的数量 p=newint[n]; spare=newint[n];//定义空闲块的块号 head=0; cout<<"请输入"<<n<<"个块的对应空闲块的块号。"<<endl; for(i=0;i<n;i++)//输入空闲的块号 { cin>>k;//空闲的块号 spare[i]=k; p[head]=-1;//初始的时候-1表示内存当前的块为空 head=(head+1)%M; } head=0; for(intj=0;j<M&&j<N;j++,head=(head+1)%M)//将进程一部分请入内存修改相应的内容 { p[head]=head; a[head].flag=1; a[head].number=spare[head]; }ii).模拟请求分页存储管理step1:输入指令s=neworder;//定义一个结构体变量。 cout<<"请输入操作:"<<endl; cin>>s->p; cout<<"请输入页号:"<<endl;//待修改 cin>>s->i1; cout<<"请输入偏移量:"<<endl; cin>>s->offset;Step2:调用模拟请求分页存储管理函数Step1:看a[s->i1].flag是否为1,为1说明要操作的块在内存之中在判断操作是否为存操作,为存操作的话则置修改位为1.if(a[s->i1].flag==1) { cout<<"主存物理地址为:"<<(a[s->i1].number*64+s->offset)<<endl; if(strcmp(s->p,"存")==0) a[s->i1].change=1; }Step2:如果当前要操作的块不在内存之中则发生缺页调用先进先出算法来进行调度else { cout<<"发生了缺页中断,运行中断处理程序。"<<endl; if(FIFO(s->i1)==1) operate(s); else cout<<"出错。"<<endl; }iii)先进先出算法实现分页管理的缺页调度step1:看看内存中没无空闲的块,有的话将块请入内存并且设置相应的参数。if(p[head]==-1)//head指针指向空闲的块将其请入内存 { p[head]=i;//将要操作的进程块的块号存入存放空闲进程块的表 a[i].flag=1;//有效位为1 a[i].number=spare[head];//主存块表号修改 head=(head+1)%M; return1;//返回成功。 }step2:内存没有空闲的块则将内存最先进入内存的块请出到兑换区再将进程请入到内存中。并且修改相应的信息。else { a[p[head]].flag=0;请出兑换区 a[p[head]].number=-1; if(a[p[head]].change==1) cout<<"将本页面写入交换区"<<endl; a[p[head]].change=0; p[head]=i;//请入内存。 a[i].flag=1; a[i].number=spare[head]; cout<<"装入"<<endl; head=(head+1)%M; return1;//返回成功。 }4.运行结果源程序:#include<iostream>#include<cstdlib>#include<iomanip>usingnamespacestd;structpage{ inti; intflag; intnumber; longaddress; intchange;};structorder{ charp[10]; inti1;//页号 intoffset;//偏移量};classprocess{private: page*a; intM;//数组的长度 int*p; intN;//页表的长度 inthead; int*spare;public: process() { intn; intk; cout<<"请输入进程的页数"<<endl; cin>>n; a=newpage[n]; N=n; for(inti=0;i<n;i++) { a[i].i=i; a[i].flag=0; a[i].number=-1; a[i].address=11+i; a[i].change=0; } cout<<"请输入进程空闲块的数目:"<<endl; cin>>n; M=n;//主存中空闲的块的数量 p=newint[n]; spare=newint[n]; head=0; cout<<"请输入"<<n<<"个块的对应空闲块的块号。"<<endl; for(i=0;i<n;i++)//输入空闲的块号 { cin>>k; spare[i]=k; p[head]=-1; head=(head+1)%M; } head=0; for(intj=0;j<M&&j<N;j++,head=(head+1)%M) { p[head]=head; a[head].flag=1; a[head].number=spare[head]; } } ~process() { deletea; deletep; deletespare; } voidoperate(order*s) { if(a[s->i1].flag==1) { cout<<"主存物理地址为:"<<(a[s->i1].number*64+s->offset)<<endl; if(strcmp(s->p,"存")==0) a[s->i1].change=1; } else { cout<<"发生了缺页中断,运行中断处理程序。"<<endl; if(FIFO(s->i1)==1) operate(s); else cout<<"出错。"<<endl; } } intFIFO(inti) { if(p[head]==-1) { p[head]=i; a[i].flag=1; a[i].number=spare[head]; head=(head+1)%M; return1; } else { a[p[head]].flag=0; a[p[head]].number=-1; if(a[p[head]].change==1) cout<<"将本页面写入交换区"<<endl; a[p[head]].change=0; p[head]=i; a[i].flag=1; a[i].number=spare[head]; cout<<"装入"<<endl; head=(head+1)%M; return1; } return0; } voidshow() { cout<<"进程的页表:"<<endl; cout<<""<<endl; cout<<"页号\t"<<"有效位\t"<<"主存块号\t"<<"外存地址\t"<<"修改位"<<endl; for(inti=0;i<N;i++) { cout<<a[i].i<<setw(10)<<a[i].flag<<setw(10)<<a[i].number<<setw(15)<<a[i].address<<setw(15)<<a[i].change<<endl; } cout<<""<<endl; cout<<"内存分配表:"<<endl; cout<<""<<endl; cout<<"目前在内存中的页号"<<endl; for(intj=0;j<M;j++) { cout<<p[j]; if(j==head)cout<<"<"<<"head"<<endl; elsecout<<endl; } }};intmain(){ processl; order*s; intx=0; for(;x!=3;) { cout<<""<<endl; cout<<"1-输入一条指令"<<endl; //cout<<"2-撤销一个进程"<<endl; cout<<"2-输出"<<endl; cout<<"3-退出"<<endl;

温馨提示

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

评论

0/150

提交评论