#include<iostream>
using namespace std;
const int MAX=50;
const int M=3;//物理块大小
int W;//作业个数
int Work[MAX];
int array[M];
//-----------初始化----------------------
void initial(){
cout<<"物理块大小:"<<M<<endl;;
cout<<"页面个数:";
cin>>W;
cout<<"页面序列:";
for(int i=0;i<W;i++)
cin>>Work[i];
}
//----------------判断是否命中-------------------
int find(int target,int array[]){
int i;
for(i=0;i<M;i++)
if(array[i]==target)
break;
if(i==M)
return -1;
else
return i;
}
//--------------------FIFO-----------------------
void FIFO(){
cout<<"=========先进先出页面置换算法=========="<<endl;
int i,j=0,k;
int Count=0;
for(i=0;i<W;i++){
if(i<M){
array[j]=Work[i];
j++;
}
else{
if(find(Work[i],array)==-1){
j=0;
for(j;j+1<M;j++)
{
array[j]=array[j+1];
}
array[M-1]=Work[i];
}
else
{
Count++;
/* cout<<endl;*/
continue;
}
}
/* for(k=0;k<M&&array[k]!=0;k++)
cout<<array[k]<<" ";
cout<<endl;*/
}
k=W-Count;
cout<<"缺页次数:"<<k<<endl<<"缺页率:"<<k*100/W<<"%"<<endl;
cout<<endl;
}
//---------------------LRU-----------------------------
void LRU(){
cout<<"=====最近最久未使用置换算法=========="<<endl;
int i,temp,k,j=0,Count=0;
for(i=0;i<W;i++)
{
if(i<M){
array[j]=Work[i];
j++;
}
else{
if(find(Work[i],array)<0){
j=0;
for(j;j+1<M;j++)
{
array[j]=array[j+1];
}
array[M-1]=Work[i];
}
else
{
Count++;
temp=array[find(Work[i],array)];
array[find(Work[i],array)]=array[M-1];
array[M-1]=temp;
cout<<endl;
continue;
}
}
for(k=0;k<M&&array[k]!=0;k++)
cout<<array[k]<<" ";
cout<<endl;
}
cout<<"缺页次数:"<<(W-Count)<<endl<<"缺页率:"<<((W-Count)*100/W)<<"%"<<endl;
cout<<endl;
}
void main(){
int choice;
cout<<"==================页面置换算法========================"<<endl;
initial();
cout<<endl<<"1->先进先出页面置换算法"<<endl<<"2->最近最久未使用页面置换算法"<<endl<<"0->退出"<<endl;
while(1)
{
cout<<endl<<"请输入你要使用的页面置换算法:"<<endl;
cin>>choice;
switch(choice){
case(1):
FIFO();
break;
case(2):
LRU();
break;
case(0):
exit(0);
break;
}
if(choice==0)
break;
}
}