#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
int count(int x,int pos,vector<int>a)
{
int count=0;
for(int i=0;i<pos;i++)
{
if(x==a[i])
{
count++;
}
}
return count;
}
void FIFO(int num_of_virtual_block,int num_of_add,vector<int>a)
{
vector<int>b;
int k=0;
int sum=0;
for(int i=0;i<num_of_add;i++)
{
int judge=0;
cout<<"要访问的页面:"<<a[i]<<endl;
for(int j=0;j<b.capacity();j++)
{
if(a[i]==b[j])
{
cout<<"要访问的页面已在虚拟页面中,未发生页面中断!"<<endl;
judge=1;
sum++;
}
}
if(judge==1)
{
continue;
}
if(b.size()<num_of_virtual_block)
{
b.push_back(a[i]);
}
else
{
b[k%3]=a[i];
k++;
}
cout<<"页面块中的虚拟页面:";
for(int i=0;i<b.size();i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
}
cout<<"发生缺页中断的次数:"<<num_of_add-sum<<"命中率:"<<float(sum)/num_of_add;
}
void LRU(int num_of_virtual_block,int num_of_add,vector<int>a)
{
vector<int>b;
int sum=0;
for(int i=0;i<num_of_add;i++)
{
int judge=0;
cout<<"要访问的页面:"<<a[i]<<endl;
for(int j=0;j<b.capacity();j++)
{
if(a[i]==b[j])
{
cout<<"要访问的页面已在虚拟页面中,未发生页面中断!"<<endl;
judge=1;
sum++;
}
}
if(judge==1)
{
continue;
}
if(b.size()<num_of_virtual_block)
{
b.push_back(a[i]);
}
else
{
int min=num_of_add+10;
int min_pos=0;
for(int j=0;j<b.size();j++)
{
if(count(b[j],i,a)<min)
{
min=count(b[j],i,a);
min_pos=j;
}
}
b[min_pos]=a[i];
}
cout<<"页面块中的虚拟页面:";
for(int i=0;i<b.size();i++)
{
cout<<b[i]<<" ";
}
cout<<endl;
}
cout<<"发生缺页中断的次数:"<<num_of_add-sum<<"命中率:"<<float(sum)/num_of_add;
}
int main()
{
vector<int> a;
int num_of_virtual_block;
int num_of_add;
int block;
int x;
cout<<"请输入虚页的个数:";
cin>>num_of_virtual_block;
cout<<"请输入页地址流的个数:";
cin>>num_of_add;
cout<<"请依次输入要访问的地址流:";
for(int i=0;i<num_of_add;i++)
{
cin>>block;
a.push_back(block);
}
for(int i=0;i<num_of_add;i++)
{
cout<<a[i]<<" ";
}
cout<<endl;
cout<<"请输入想要利用的页面置换算法,如果想要利用FIFO算法,请输入1;如果想要利用LRU算法,请输入2!";
cin>>x;
//启动FIFO算法
if(x==1)
{
FIFO(num_of_virtual_block,num_of_add,a);
}
//启动LRU算法
if(x==2)
{
LRU(num_of_virtual_block,num_of_add,a);
}
}
版权声明:本文为m0_57317650原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。