#include<iostream>
using namespace std;
int Process[100]; //页面队列
int Memory[3]; //块数
int OPTQueue[100]; //OPT算法的队列
int FIFOQueue[100]; //FIFO算法队列
int LRUQueue[100]; //LRU算法队列
int time[100]; //设置的一个时间标志,FIFO算法时判断哪个是最先进来的
int flag[100]; //设置一个标志,LUR算法判断哪个是最近最久未使用的
int ProcessNum; //页面数
//OPT算法找到最长未使用的
int longest(int start)
{
int i,s;
int zero=0,one=0,two=0;
int temp,max;
for(i=start+1;i<ProcessNum;i++)
{
if(Memory[0]!=OPTQueue[i])
zero++;
if(Memory[0]==OPTQueue[i])
break;
}
for(i=start+1;i<ProcessNum;i++)
{
if(Memory[1]!=OPTQueue[i])
one++;
if(Memory[1]==OPTQueue[i])
break;
}
for(i=start+1;i<ProcessNum;i++)
{
if(Memory[2]!=OPTQueue[i])
two++;
if(Memory[2]==OPTQueue[i])
break;
}
temp=(one>two)?one:two;
max=(temp>zero)?temp:zero;
if(max==zero)
s=0;
if(max==one)
s=1;
if(max==two)
s=2;
return s;
}
//OPT算法
void OPT()
{
int i,j,k;
int num=3;
for(i=0;i<ProcessNum;i++)
{
OPTQueue[i]=Process[i];
}
for(i=0;i<3;i++)
{
Memory[i]=OPTQueue[i];
}
for(i=3;i<ProcessNum;i++)
{
for(j=0;j<3;j++)
{
if(Memory[j]==OPTQueue[i])
break;
}
if(j==3)
{
k=longest(i);
Memory[k]=OPTQueue[i];
num++;
}
}
cout<<"缺页次数:"<<num<<endl;
float str;
str=(float)num/ProcessNum;
cout<<"缺页率="<<str*100<<"%"<<endl;
}
//FIFO算法找到最早进来的那个
int MaxTime()
{
int i;
if(time[0]<time[1] && time[0]<time[2])
i=0;
if(time[1]<time[0] && time[1]<time[2])
i=1;
if(time[2]<time[1] && time[2]<time[0])
i=2;
return i;
}
//FIFO算法
void FIFO()
{
int i,j,k;
int num=3;
for(i=0;i<ProcessNum;i++)
{
FIFOQueue[i]=Process[i];
}
for(i=0;i<3;i++)
{
Memory[i]=FIFOQueue[i];
time[i]=i;
}
for(i=3;i<ProcessNum;i++)
{
for(j=0;j<3;j++)
{
if(Memory[j]==FIFOQueue[i])
break;
}
if(j==3)
{
k=MaxTime();
time[k]=i;
Memory[k]=FIFOQueue[i];
num++;
}
}
cout<<"缺页次数:"<<num<<endl;
float str;
str=(float)num/ProcessNum;
cout<<"缺页率="<<str*100<<"%"<<endl;
}
//LRU算法找到最近最久未使用的
int MinFlag()
{
int i;
if(flag[0]<flag[1] && flag[0]<flag[2])
i=0;
if(flag[1]<flag[0] && flag[1]<flag[2])
i=1;
if(flag[2]<flag[1] && flag[2]<flag[0])
i=2;
return i;
}
//LRU算法
void LRU()
{
int i,j,k;
int num=3;
for(i=0;i<ProcessNum;i++)
{
LRUQueue[i]=Process[i];
}
for(i=0;i<3;i++)
{
Memory[i]=LRUQueue[i];
flag[i]=i;
}
for(i=3;i<ProcessNum;i++)
{
for(j=0;j<3;j++)
{
if(Memory[j]==LRUQueue[i])
{
flag[j]=i;
break;
}
}
if(j==3)
{
k=MinFlag();
flag[k]=i;
Memory[k]=LRUQueue[i];
num++;
}
}
cout<<"缺页次数:"<<num<<endl;
float str;
str=(float)num/ProcessNum;
cout<<"缺页率="<<str*100<<"%"<<endl;
}
void main()
{
int i;
cout<<"-------------------页面置换算法-------------------------"<<endl;
cout<<"请输入进程数:"<<endl;
cin>>ProcessNum;
cout<<"请输入每个进程的页面号:"<<endl;
for(i=0;i<ProcessNum;i++)
cin>>Process[i];
cout<<"------------------OPT最佳置换算法-----------------------"<<endl;
OPT();
cout<<"---------------FIFO先进先出页面置换算法--------------"<<endl;
FIFO();
cout<<"---------------LRU最近最久未使用置换算法-------------"<<endl;
LRU();
}