当前位置:文档之家› 虚拟存储器管理 .

虚拟存储器管理 .

淮海工学院计算机工程学院实验报告书课程名:《操作系统原理》题目:虚拟存储器管理班级:网络122学号:姓名评语:成绩:指导教师:批阅时间:年月日一、实验目的请求页式虚存管理是常用的虚拟存储管理方案之一。

通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。

二、实验内容本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。

其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。

要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。

程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。

三、实验步骤1.实验说明实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。

初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。

2.实验流程Y N 发生缺页N Y主页面 OPT 算法 LRU 算法 开始 取指令 取指令中的负号 查页表页标志=1? 形成绝对地址 输出绝对地址 输出*页号表示发生缺页中断 有后续指令 取下条指令 输出缺页数及缺页率 结束四、实验源程序#include<iostream>#include<math.h>#include<malloc.h>using namespace std;#define M 9#define N 20typedef struct node1/*页面的数据结构*/{int num;int age;int state;int blocknum;}page ;typedef struct node2/*内存块的数据结构*/{int num;int state;int pagenum;int age;}Block;void LRU(Block b[],int n,page p[],int m)/*最近最少使用页面置换算法*/ {int i,j,j1,k,mm,mn,flag=0;float num=0,c=0;for (j=0;j<m;j++){for (mm=0;mm<n;mm++){if(b[mm].pagenum==p[j].num)flag=1;}if(flag==1) cout<<endl<<"此次未出现缺页(NF)"<<endl; else if (flag==0){ c++;cout<<endl<<"出现缺页(F)\n";if (p[j].state==0){for(i=0;i<n;i++){if(b[i].state==0){p[j].blocknum=b[i].num;p[j].state=1;b[i].pagenum=p[j].num;b[i].state=1;break;}}if(i>=n){for (mn=j-1;mn>=0;mn--){if(num<n){num++;for (j1=mn+1;j1<=j-1;j1++){if(p[mn].num==p[j1].num){num--;}}}if (num==n){break;}}for (mm=0;mm<n;mm++){if (p[mn].num==b[mm].pagenum){k=mm;break;}}b[k].pagenum=p[j].num;b[k].age=0;p[j].blocknum=b[mm].num;p[j].state=1;}}}cout<<"页面调序列为:";for (mm=0;mm<n;mm++){cout<<b[mm].pagenum<<" ";}cout<<endl<<endl;flag=0;num=0;}cout<<"缺页总次数:"<<c<<endl;cout<<"缺页率:"<<c/12<<endl;}void OPT(Block b[],int n,page p[],int m)/*最优页面置换算法*/ {int i,j,k,mm,mn,flag=0;int maxage=-1;float c=0;for (j=0;j<m;j++){for (mm=0;mm<n;mm++){if(b[mm].pagenum==p[j].num)flag=1;}if(flag==1) cout<<endl<<"此次未出现缺页(NF)"<<endl;else if (flag==0){ c++;cout<<endl<<"出现缺页(F)\n";if (p[j].state==0){for(i=0;i<n;i++){if(b[i].state==0){p[j].blocknum=b[i].num;p[j].state=1;b[i].pagenum=p[j].num;b[i].state=1;break;}}if(i>=n){for (mm=0;mm<n;mm++){for (mn=j+1;mn<m;mn++){if (b[mm].pagenum==p[mn].num){b[mm].age=mn;break;}}if(mn>=m){b[mm].age=100;}}for(k=0;k<n;k++){if(maxage<b[k].age){maxage=b[k].age;mm=k;}}b[mm].pagenum=p[j].num;b[mm].age=0;p[j].blocknum=b[mm].num;p[j].state=1;}}}cout<<"页面序列为:"<<endl;for (mm=0;mm<n;mm++){cout<<b[mm].pagenum<<" ";}cout<<endl<<endl;flag=0;maxage=-1;}cout<<"缺页总次数:"<<c<<endl;cout<<"缺页率:"<<c/12<<endl;}int display(Block b[],int m,page pag[], int n) {int chose;for(int i=0;i<n;i++){pag[i].age=0;pag[i].state=0;pag[i].blocknum=-1;}for(i=0;i<m;i++){b[i].num=i;b[i].state=0;b[i].pagenum=-1;b[i].age=0;}cout<<"1. LRU替换算法\n"<<"2. OPT替换算法\n"<<"0. 退出"<<endl;cout<<"请输入您的选择:";cin>>chose;return (chose);}void main(){Block b[M];page pag[N];int chose;int m,n;cout<<"***********虚拟存储器LRU算法,OPT算法************"<<endl;cout<<"请输入内存块个数:"<<endl;cin>>m;cout<<"请输入页面个数:"<<endl;cin>>n;cout<<"请输入页面序列:"<<endl;for(int i=0;i<n;i++){cin>>pag[i].num;}while(1){chose=display(b,m,pag,n);if(chose==1){LRU(b,m,pag,n);cout<<endl<<endl;}else if(chose==2){OPT(b,m,pag,n);cout<<endl<<endl;}else if(chose==0){exit(0);}}}五、实验结果六.实验感想:这两种算法中,最优置换的缺页率最少,最近最少使用算法次之。

最佳值换算发是无法实现的,但是却可以用来评价其他的算法。

LRU算法算法性能比较差,是因为它所依据的条件是各个页面调入内存的机间,而页面调入的先后顺序并不能反应页面的使用情况。

通过此次实验,让我了解到如何设计、编制并调试页面置换算法,加深对内存管理的理解;熟悉了页面置换的相关原理,使用某种高级语言(例如C++语言)直接编写页面置换程序。

另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。

在做实验时,我们一定要学会独立思考,依赖别人,永远都不能真正提高自己的实践能力,也不能真正的掌握理论知识。

要注意联系理论知识,是自己的程序和算法设计更好的达到最初的实验目的。

在学习中,我们一定不能不求甚解,懂得提问,能提出有价值的问题,并通过各种途径解决自己的问题才能快速且扎实的掌握知识。

相关主题