您的位置:首页 > 其它

(操作系统)模拟操作系统的页面置换

2015-03-06 23:21 281 查看
一、 需求分析

设计程序模拟先进先出(FIFO)置换算法,最佳(OPT)置换算法和最近最少用(LRU)置换算法的工作过程。假设内存中分配给每个进程的最小物理块数为m,在进程运行过程中要访问的页面个数为n,页面访问序列为P1, … ,Pn,分别利用不同的页面置换算法调度进程的页面访问序列,给出页面访问序列的置换过程,计算每种算法缺页次数和缺页率。

程序的设计主要是测试先进先出FIFO,最佳置换OPT和最近最少用LRU页面置换算法的效率以及过程,对于程序员设计有很多帮助,不同的场合用不同的算法可以提高程序的效率。

二、详细设计

1、数据结构

int a[320];//存放320条指令
int p;//存放页大小
int page[320];//存放合并后要使用的页号
int PageNumber;//存放页号数量
int piece;//存放块数
2、算法流程图
a.先进先出(FIFO)置换算法:



b.最近最少用(LRU)置换算法:



c.最佳(OPT)置换算法:



三、 软件测试
1、如图一所示,通过随机数产生一个指令序列,共320条指令。指令的地址按下述原则生成:
A:50%的指令是顺序执行的
B:25%的指令是均匀分布在前地址部分
C:25%的指令是均匀分布在后地址部分
具体的实施方法是:
A:在[0,319]的指令地址之间随机选取一起点m
B:顺序执行一条指令,即执行地址为m+1 的指令
C:在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为m'
D:顺序执行一条指令,其地址为m'+1
E:在后地址[m'+2,319]中随机选取一条指令并执行 F:重复步骤A-E,直到320 次指令



图1.指令地址
2、如图2所示,页面大小的取值范围为1K,2K,4K,8K,16K。按照页面大小将指令地址转化化为页号。对于相邻相同的页号,合并为一个。



图2.合并后的页地址流
3.选择不同的块数和不同的页面置换算法会得出不同的缺页率,为了方便观察比较,下面选取相同的块数(4块)和不同的页面置换算法,求出缺页率。如图3-a,3-b,3-c所示:



图3-a.最佳置换算法(节选)
三、 总结
本次实验主要用DOS界面实现模拟操作系统的页面置换功能。在本次实验中,没有用到MFC界面,使得实验数据冗长,不过也更能直观反应是否缺页,便于统计。实现先进先出、最近最少用和最佳置换算法时候,一开始的思路都有初始化进入内存块数的页数的函数,后来再次看的时候发现太冗长而且没有这个必要。
附:源程序
//PageReplacement.cpp
#include<iostream>
#include<time.h>
#include<iomanip>
#include"FIFO.h"
#include"LRU.h"
#include"OPT.h"
using namespace std;
void Random(int a[],int n);
int Translate(int a[],int Page[],intn,int p);
int main()
{
inta[320];//存放320条指令
inti=1;
intp;//存放页大小
intpage[320];//存放合并后要使用的页号
intPageNumber;//存放页号数量
intpiece;//存放块数
boolflag=true;
while(flag)
{
switch(i)
{
case1:
Random(a,320);
case2:
cout<<"请输入页大小(1K、2K、4K、8K、16K、):";
cin>>p;
PageNumber=Translate(a,page,320,p);
cout<<"将相邻相同的页号合并为一个后要使用到的页号数为"<<PageNumber<<"个"<<endl;
case3:
cout<<"请输入块数(1~"<<32/p<<"):";
cin>>piece;
case4:
cout<<"请选择页面置换算法(1~3)"<<endl;
cout<<"1.最佳置换算法(OPT)"<<endl;
cout<<"2.先进先出置换算法(FIFO)"<<endl;
cout<<"3.最近最少用置换算法(LRU)"<<endl;
cin>>i;
switch(i)
{
case1:OPT(page,PageNumber,piece,32/p);break;
case2:FIFO(page,PageNumber,piece,32/p);break;
case 3:LRU(page,PageNumber,piece,32/p);break;
default:cout<<"输入有误"<<endl;break;
}
cout<<"*****************************"<<endl;
cout<<"*****1.重新开始"<<endl;
cout<<"*****2.返回重新输入页大小"<<endl;
cout<<"*****3.返回重新输入块数"<<endl;
cout<<"*****4.返回重新选择页面置换算法"<<endl;
cout<<"*****5.结束程序"<<endl;
cin>>i;break;
default:flag=false;
}
}
return0;
}
void Random(int a[],int n)
{
cout<<"指令如下:"<<endl;
intm,i=0;
srand(unsignedint(time(NULL)));
while(i<n)
{
a[i++]=rand()%n;
m=a[i]=a[i-1]+1;
a[++i]=rand()%(m+1);
i++;
m=a[i]=a[i-1]+1;
a[++i]=rand()%(n-m+1)+m+1;
i++;
}
for(i=0;i<n;i++)
{
cout<<a[i]<<setw(4);
if((i+1)%10==0)
cout<<endl;
}
cout<<endl;
}
int Translate(int a[],int Page[],intn,int p)
{
cout<<"页面调度序列如下:"<<endl;
inti,j=0;
inttemp=-1,result;
for(i=0;i<n;i++)
{
result=a[i]/(p*10);
if(result!=temp)
temp=Page[j++]=result;
}
for(i=0;i<j;i++)
{
cout<<Page[i]<<setw(4);
if((i+1)%10==0)
cout<<endl;
}
cout<<endl;
returnj;
}

.\FIFO.H
//先进先出置换算法
#include<iostream>
#include<iomanip>
using namespace std;
//输出函数
void Output1(int *p,int n)
{
for(inti=0;i<n;i++)
cout<<p[i]<<setw(4);
}
void FIFO(int Page[],int n,intpiece,int total)
{
inti,number=0,j,position=0;
intrate=0;
int*p=new int [piece];
for(i=0;i<piece;i++)
p[i]=-1;//内存块数赋初值
for(i=0;i<n;i++)
{
cout<<i+1<<"";
cout<<Page[i]<<":"<<setw(4);
for(j=0;j<piece&&p[j]!=Page[i];j++)//查找是否缺页
;
if(p[j]==Page[i])
{
Output1(p,piece);
cout<<"不缺页"<<endl;
}
else
{
rate++;
for(j=0;j<piece-1;j++)//缺页处理
p[j]=p[j+1];
p[j]=Page[i];
Output1(p,piece);
cout<<"缺页"<<endl;
}
}
cout<<"缺页次数:"<<rate<<""<<"总数"<<n<<endl;
cout<<"先进先出置换算法(FIFO)缺页率为"<<(double)rate/n*100<<"%"<<endl;
delete[]p;
}
.\LRU.H
//最近最少用置换算法
#include<iostream>
#include<iomanip>
using namespace std;
void LRU(int Page[],int n,int piece,inttotal)
{
inti,number=0,j,position=0;
intrate=0;
inttemp;
int*p=new int [piece];
for(i=0;i<piece;i++)
p[i]=-1;//内存块数赋初值
for(i=0;i<n;i++)
{
cout<<i+1<<" ";
cout<<Page[i]<<":"<<setw(4);
for(j=0;j<piece&&p[j]!=Page[i];j++)//查找是否缺页
;
if(p[j]==Page[i])//不缺页处理
{
temp=p[j];
while(j<piece-1)
{
p[j]=p[j+1];
j++;
}
p[j]=temp;
Output1(p,piece);
cout<<"不缺页"<<endl;
}
else//缺页处理
{
rate++;
for(j=0;j<piece-1;j++)
p[j]=p[j+1];
p[j]=Page[i];
Output1(p,piece);
cout<<"缺页"<<endl;
}
}
cout<<"缺页次数:"<<rate<<""<<"总数"<<n<<endl;
cout<<"最近最少用置换算法(LRU)缺页率为"<<(double)rate/n*100<<"%"<<endl;
delete[]p;
}

.\OPT.H
//最佳置换算法
#include<iostream>
#include<iomanip>
using namespace std;
void OPT(int Page[],int n,int piece,inttotal)
{
inti,number=0,j,position=0,temp;
intrate=0;
int*p=new int [piece];
int*flag=new int[total];
//标记页数在内存的情况,0:不在内存块,1:在内存块,2:以后会再次访问并且已经在内存块的
for(i=0;i<piece;i++)
p[i]=-1;//内存块数赋初值
for(i=0;i<total;i++)
flag[i]=0;
for(i=0;i<n;i++)//缺页处理
{
cout<<i+1<<"";
if(flag[Page[i]]!=1)
{
rate++;
j=i+1;
temp=piece;
while(temp!=1&&j<n)
{
if(flag[Page[j]]==1)
{
flag[Page[j]]=2;
temp--;
}
j++;
}
for(j=0;j<piece;j++)
if(flag[p[j]]==1)
temp=j;
elseflag[p[j]]=1;
flag[p[temp]]=0;
flag[Page[i]]=1;
p[temp]=Page[i];
cout<<Page[i]<<":"<<setw(4);
Output1(p,piece);
cout<<"缺页"<<endl;
}
else
{
cout<<Page[i]<<":"<<setw(4);
Output1(p,piece);
cout<<"不缺页"<<endl;
}
}
cout<<"缺页次数:"<<rate<<""<<"总数"<<n<<endl;
cout<<"最佳置换算法(OPT)缺页率为"<<(double)rate/n*100<<"%"<<endl;
delete[]p;
delete[]flag;
}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: