#include<iostream>
using namespace std;
void nur(int N,int a[],int size)
{
int opt[N]={1,0,7 };
int len[N]={0,0,0};
int sum;
int dq=3;
int flag=0;
int allchagetime=0;
do{
for(int i=0;i<N;i++){
cout<<opt[i]<<" ";
}
cout<<endl;
for(int i=0;i<N;i++){
sum=0;
if(a[dq]==opt[0]||a[dq]==opt[1]||a[dq]==opt[2]){
flag=1;
break;
} else{
flag=0;
for(int j=dq-1;j>=0;j--)
{
sum++;
if(opt[i]==a[j]||j==0){
len[i]=sum;
break;
}
}
}
}
if(flag==0)
{
int max=len[0];
int res;
for(int t=0;t<N;t++) {
if(len[t]>=max){
res=t;
max=len[t];
}
}
opt[res]=a[dq];
allchagetime++;
}
dq++;
}while(dq!=21);
cout<<"缺页"<<allchagetime+3-1<<"次,"<<"置换"<<allchagetime-1<<"次"<<endl;
double m=(double)(allchagetime+3-1)/(double)(size)*100.0;
cout<<"缺页率为:"<<m<<"%"<<endl;
cout<<endl;
}
int lru(int a[],int block,int number)
{
int q=0,i,temp;
int b[block];
for(i=0;i<block;i++)
{
b[i]=-1;
}
for(i=0;i<number;i++)
{
if(i<3)
{
printf("缺页:%d\n",a[i]);
q++;
b[2]=b[1];
b[1]=b[0];
b[0]=a[i];
}
else
{
if(b[0]!=a[i]&&b[1]!=a[i]&&b[2]!=a[i])
{
printf("缺页:%d\n",a[i]);
q++;
b[2]=b[1];
b[1]=b[0];
b[0]=a[i];
}
else if(b[0]==a[i])
{
printf("%d不缺页,且不进行更新。\n",a[i]);
}
else if(b[1]==a[i])
{
printf("%d不缺页,但进行更新。\n",a[i]);
temp=b[1];
b[1]=b[0];
b[0]=temp;
}
else if(b[2]==a[i])
{
printf("%d不缺页,但进行更新。\n",a[i]);
temp=b[2];
b[2]=b[1];
b[1]=b[0];
b[0]=temp;
}
}
printf("%d %d %d",b[0],b[1],b[2]);
printf("\n");
}
return q;
}
int main()
{
int i,l,number,block;
printf("请输入页面访问个数:\n");
scanf("%d",&number);
int a[number];
printf("请输入物理块个数\n");
scanf("%d",&block);
printf("请输入页面访问顺序。\n");
for(i=0;i<number;i++)
{
scanf("%d",&a[i]);
}
printf("===========nur页面置换算法===========\n");
nur(block,a,number);
printf("===========lru页面置换算法===========\n");
l=lru(a,block,number);
printf("缺页%d次,置换%d次。\n",l,l-3);
double m=(double)(l)/(double)(number)*100.0;
cout<<"缺页率为:"<<m<<"%"<<endl;
system("pause");
return 0;
}
LRU、NUR页面置换算法
于 2022-01-08 19:42:53 首次发布