操作系统作业四:页面置换仿真实验
实验内容:
1.设计进行页面置换管理的数据结构;
2.实现FIFO,LRU页面置换算法,支持固定分配局部置换策略的实现;
3.程序可以指定进程所分配的页框数量,可以仿真随机产生页面访问序列(rand),页面访问序列的最大页面编号可指定,伪随机数种子可设定(srand()),页面序列长度可设定;
4.A:采用伪随机数发生器产生不小于1000次页面访问的序列,统计缺页率;B: 特别指定如下设定:3个页框,最大逻辑页号为7,20个页面访问序列7 0 1 2 0 3 0 4 2 3 0 3 2 5 4 3 6 5 3 2的仿真,打印输出内存置换情况,包括当前页框中页面情况,每个页面访问是否在内存中,页面置换情况等。
#include<bits/stdc++.h>
#include<ctime>
using namespace std;
const int maxx=1e5;
int page_box;//页框数量
int Max_logical_page;//最大逻辑页号
int random_length;//随机序列长度
int X[maxx];//随机序列
int block[3][50];
bool sub[maxx];
bool lack[maxx];
int page_lack;
int ans;
int cnt;
int temp;
struct LRU
{
int value;
int time;
};
void init()
{
memset(sub,0,sizeof(sub));
memset(lack,0,sizeof(lack));
for(int i=0;i<3;i++)
for(int j=0;j<50;j++)
{
block[i][j]=0;
}
}
void fifo(int R[])
{
init();
page_lack=0;
cnt=0;
temp=0;
deque<int>page_set;
deque<int>::iterator pos;
deque<int>::iterator pre;
for(int i=0;i<random_length;i++)
{
int flag=0;
for(pos=page_set.begin();pos!=page_set.end();pos++)
{
if((*pos)==R[i])
{
flag=1;
//找到说明无需置换
if(ans==2)
{
lack[cnt]=0;
sub[cnt]=0;
for(int i=0;i<3;i++)block[i][cnt]=block[i][cnt-1];
cnt++;
}
break;
}
}
if(!flag)
{
if(page_set.size()>=page_box)
{
page_set.pop_front();//页框无空余则删除头部元素
if(ans==2)sub[cnt]=1;
}
page_set.push_back(R[i]);
page_lack++;
if(ans==2)
{
lack[cnt]=1;
temp++;//当前占用的物理块
temp%=3;
if(page_set.size()==1)
{
block[0][cnt]=R[i];
temp=2;
}
else
{
for(pre=page_set.begin();pre!=page_set.end();pre++)
{
block[temp++][cnt]=(*pre);
temp%=3;
}
}
cnt++;
}
}
}
printf("fifo缺页中断次数为:%d\n",page_lack);
printf("fifo缺页中断率为:%lf\n",(double)page_lack*1.0/random_length);
}
void lru(int R[])
{
init();
page_lack=0;
temp=0;
deque<LRU> page_set;
deque<LRU>::iterator pos;
deque <LRU>::iterator pre;
for(int i=0;i<random_length;i++)
{
int flag=0;
for(pos=page_set.begin();pos!=page_set.end();pos++)//当前访问在页框中
{
if((*pos).value==R[i])
{
flag=1;
if(ans==2)
{
lack[cnt]=0;
sub[cnt]=0;
for(int i=0;i<3;i++)block[i][cnt]=block[i][cnt-1];
cnt++;
}
break;
}
}
if(!flag)
{
bool flew=0;
if(page_set.size()>=page_box)//无空余页框且不在页框
{
int m=page_set.front().time;
deque <LRU>::iterator mp=page_set.begin();
for(pre=page_set.begin();pre!=page_set.end();pre++)
{
if((*pre).time>m)
{
mp=pre;
m=(*mp).time;
}
}
int vv=(*mp).value;
page_set.erase(mp);//找到时间相距离最远的
if(ans==2)
{
sub[cnt]=1;
for(int j=0;j<page_box;j++)
{
if(block[j][cnt-1]==vv)block[j][cnt]=R[i];//找到时间最远所在页框
else block[j][cnt]=block[j][cnt-1];
}
}
flew=1;
}
LRU new_lru;
new_lru.value=R[i];
new_lru.time=0;
page_set.push_back(new_lru);
page_lack++;
lack[cnt]=1;
if(flew==0)//有空余页框
{
temp=0;
for(pre=page_set.begin();pre!=page_set.end();pre++)
{
block[temp++][cnt]=(*pre).value;
temp%=3;
}
}
cnt++;
}
//更新距离当前的时间
for(pre=page_set.begin();pre!=page_set.end();pre++)
{
for(int j=i;j>=0;j--)
{
if(R[j]==(*pre).value)
{
(*pre).time=i-j;
break;
}
}
}
}
printf("lru缺页中断次数为:%d\n",page_lack);
printf("lru缺页中断率为:%lf\n",(double)page_lack*1.0/random_length);
}
void Random()
{
srand(int(time(0)));
cout<<"系统随机生成的序列为"<<endl;
for(int i=0;i<random_length;i++)
{
X[i]=rand()%(Max_logical_page+1);
cout<<X[i]<<" ";
}
cout<<endl;
fifo(X);
lru(X);
}
void show(int R[])
{
cout<<"页面访问序列 ";
for(int i=0;i<20;i++)cout<<" "<<R[i]<<" ";
cout<<endl;
cout<<"页面置换过程 "<<endl;
cout<<"物理块1 ";
for(int i=0;i<20;i++)cout<<"| "<<block[0][i]<<" ";
cout<<endl;
cout<<"物理块2 ";
for(int i=0;i<20;i++)cout<<"| "<<block[1][i]<<" ";
cout<<endl;
cout<<"物理块3 ";
for(int i=0;i<20;i++)cout<<"| "<<block[2][i]<<" ";
cout<<endl;
cout<<"--------------------------------------------------------------------------------------------"<<endl;
cout<<"页面置换标志 ";
for(int i=0;i<20;i++)cout<<"| "<<sub[i]<<" ";
cout<<endl;
cout<<"页面中断标志 ";
for(int i=0;i<20;i++)cout<<"| "<<lack[i]<<" ";
cout<<endl;
}
int main()
{
cout<<"请选择功能(1/2)"<<endl;
cout<<"功能1:指定页框,最大逻辑页,随机生成指定长度(大于1000)的访问序列,并计算其FIFO LRU缺页率"<<endl;
cout<<"功能2:进行3个页框,最大逻辑页号为7,20个页面访问序列7 0 1 2 0 3 0 4 2 3 0 3 2 5 4 3 6 5 3 2的仿真,打印输出内存置换情况" <<endl;
cin>>ans;
if(ans==1)
{
cout<<"请输入页框数量、最大逻辑页号"<<endl;
cin>>page_box>>Max_logical_page;
cout<<"请输入一个不小于1000的数,以采用伪随机数发生器产生相应次页面访问的序列,统计缺页率"<<endl;
cin>>random_length;
Random();
}
else
{
page_box=3;
Max_logical_page=7;
random_length=20;
int S[20]={7,0,1,2,0,3,0,4,2,3,0,3,2,5,4,3,6,5,3,2};
cout<<"LRU页面置换过程如下: "<<endl;
lru(S);
show(S);
cout<<"FIFO页面置换过程如下:"<<endl;
fifo(S);
show(S);
}
}