虚拟存储器管理1.docx
《虚拟存储器管理1.docx》由会员分享,可在线阅读,更多相关《虚拟存储器管理1.docx(19页珍藏版)》请在冰豆网上搜索。
虚拟存储器管理1
淮海工学院计算机工程学院
实验报告书
课程名:
《操作系统原理》
题目:
虚拟存储器管理
班级:
网络122
学号:
姓名
一、实验目的
请求页式虚存管理是常用的虚拟存储管理方案之一。
通过请求页式虚存管理中对页面置换算法的模拟,有助于理解虚拟存储技术的特点,并加深对请求页式虚存管理的页面调度算法的理解。
二、实验内容
本实验要求使用C语言编程模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时分别使用FIFO和LRU算法进行页面置换的情形。
其中虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以事先保存在文件中。
要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。
程序应允许通过为该进程分配不同的实页数,来比较两种置换算法的稳定性。
3、实验步骤
1.实验说明
实验中进程的数量、资源的种类以及每种资源的总量Total[j]最好允许动态指定。
初始时每个进程运行过程中的最大资源需求量Max[i,j]和系统已分配给该进程的资源量Allocation[i,j]均为已知(这些数值可以在程序运行时动态输入),而算法中其他数据结构的值(包括Need[i,j]、Available[j])则需要由程序根据已知量的值计算产生。
2.实验流程
Y
N发生缺页
N
Y
4、实验源程序
#include
#include
#include
usingnamespacestd;
#defineM9
#defineN20
typedefstructnode1/*页面的数据结构*/
{
intnum;
intage;
intstate;
intblocknum;
}page;
typedefstructnode2/*内存块的数据结构*/
{
intnum;
intstate;
intpagenum;
intage;
}Block;
voidLRU(Blockb[],intn,pagep[],intm)/*最近最少使用页面置换算法*/
{
inti,j,j1,k,mm,mn,flag=0;
floatnum=0,c=0;
for(j=0;j{
for(mm=0;mm{
if(b[mm].pagenum==p[j].num)
flag=1;
}
if(flag==1)cout<elseif(flag==0)
{c++;
cout<if(p[j].state==0)
{
for(i=0;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{
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{
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{
cout<
}
cout<flag=0;
num=0;
}
cout<<"缺页总次数:
"<cout<<"缺页率:
"<}
voidOPT(Blockb[],intn,pagep[],intm)/*最优页面置换算法*/
{
inti,j,k,mm,mn,flag=0;
intmaxage=-1;floatc=0;
for(j=0;j{
for(mm=0;mm{
if(b[mm].pagenum==p[j].num)
flag=1;
}
if(flag==1)cout<elseif(flag==0)
{c++;
cout<if(p[j].state==0)
{
for(i=0;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{
for(mn=j+1;mn{
if(b[mm].pagenum==p[mn].num)
{
b[mm].age=mn;
break;
}
}
if(mn>=m)
{
b[mm].age=100;
}
}
for(k=0;k{
if(maxage
{
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<<"页面序列为:
"<for(mm=0;mm{
cout<
}
cout<flag=0;
maxage=-1;
}
cout<<"缺页总次数:
"<cout<<"缺页率:
"<}
intdisplay(Blockb[],intm,pagepag[],intn)
{
intchose;
for(inti=0;i{
pag[i].age=0;
pag[i].state=0;
pag[i].blocknum=-1;
}
for(i=0;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.退出"<cout<<"请输入您的选择:
";
cin>>chose;
return(chose);
}
voidmain()
{
Blockb[M];
pagepag[N];
intchose;
intm,n;
cout<<"***********虚拟存储器LRU算法,OPT算法************"<cout<<"请输入内存块个数:
"<cin>>m;
cout<<"请输入页面个数:
"<cin>>n;
cout<<"请输入页面序列:
"<for(inti=0;i{
cin>>pag[i].num;
}
while
(1){
chose=display(b,m,pag,n);
if(chose==1)
{
LRU(b,m,pag,n);
cout<}
elseif(chose==2)
{
OPT(b,m,pag,n);
cout<}
elseif(chose==0)
{
exit(0);
}
}
}
5、实验结果
六.实验感想:
这两种算法中,最优置换的缺页率最少,最近最少使用算法次之。
最佳值换算发是无法实现的,但是却可以用来评价其他的算法。
LRU算法算法性能比较差,是因为它所依据的条件是各个页面调入内存的机间,而页面调入的先后顺序并不能反应页面的使用情况。
通过此次实验,让我了解到如何设计、编制并调试页面置换算法,加深对内存管理的理解;熟悉了页面置换的相关原理,使用某种高级语言(例如C++语言)直接编写页面置换程序。
另外,也让我重新熟悉了C++语言的相关内容,加深了对C++语言的用途的理解。
在做实验时,我们一定要学会独立思考,依赖别人,永远都不能真正提高自己的实践能力,也不能真正的掌握理论知识。
要注意联系理论知识,是自己的程序和算法设计更好的达到最初的实验目的。
在学习中,我们一定不能不求甚解,懂得提问,能提出有价值的问题,并通过各种途径解决自己的问题才能快速且扎实的掌握知识。