Result:
Code:
#include<iostream>
#include<fstream>//进行文件读取的库函数
using namespace std;
int n,s=0;//n物理块数目,s页面总数
struct Physicalblock{
int name;
int nomber;//优先级1,2,3
}pb[10];
Physicalblock *p=pb;//指向最老进程的指针
void fifo(int n1)//先进先出置换算法
{
cout<<"使用fifo的置换方法结果为:"<<endl<<"淘汰的为:";
int num,t=1,flag=0,total=0;
ifstream openfile("data.txt");
while(!openfile.eof())
{
flag=0;
openfile>>num;
t++;
if(t>=n1)
{ for(int i=0;i<n;i++)
{ if(num==pb[i].name)
{ flag=1; } }
if(flag==0)
{ total++;
cout<<p->name<<" ";
p->name=num;
p++;
if(total%n1==0)
{p=pb;}}}}
openfile.close();
cout<<endl<<"缺页的总次数为:"<<total<<endl;
cout<<"缺页率为: "<<(total/(s+0.0))*100<<"%"<<endl<<endl;
}
void lru(int n1)//最近久未使用算法
{
cout<<"使用lru的置换方法结果为:"<<endl<<"淘汰的为:";
int num,t=0,flag=0,total=0,count=0;
ifstream openfile("data.txt");
while(!openfile.eof())
{
int max=-999,maxnomber=0,flag=0;//flag=0表示没有一样的,=1表示有一样的
openfile>>num;
count++;
if(count>=n1)
{ for(int i=0;i<n1;i++)//找出最大的
{if(num==pb[i].name)//检查是否有一样的
{flag=1;//flag变为1
pb[i].nomber=0;//一样的这个变为0
for(int j=0;j<n1;j++)//其他几个的等待时间加一
{ if(i==j)//除了这个一样的 不用加一
{continue;}
else pb[j].nomber++;//其余的都要加一
} }
if(pb[i].nomber>max)//同时再查找最大的
{max=pb[i].nomber;
maxnomber=i;//maxnomber标记最大的序号
} }
if(flag==0)//如果没有一样的
{cout<<pb[maxnomber].name<<" ";//把淘汰的输出
total++;//总数加一
pb[maxnomber].name=num;//把淘汰的名字换掉
pb[maxnomber].nomber=0;//时间变为0
for(int j=0;j<n1;j++)//除了这个其他的都加一
{if(j==maxnomber) continue;
else pb[j].nomber++;}} }}
openfile.close();
cout<<endl<<"缺页的总次数为:"<<total<<endl;
cout<<"缺页率为: "<<(total/(s+0.0))*100<<"%"<<endl; }
int main()
{
ifstream openfile("data.txt");//打开分页序列
int num,n1,t=0,nomber=1;//num表示数字,n1用来临时取代n
cout<<"系统需要调用的页面有:"<<endl;
while(!openfile.eof())
{s++;
openfile>>num;
cout<<num<<" "; }
cout<<endl;
openfile.close();
cout<<"请输入物理块的个数:"<<endl;
cin>>n; n1=n;
ifstream openfile2("data.txt");
while(n1--)
{if(openfile2.eof())
{cout<<"引用串已经分配完毕"<<endl;
break;}
openfile2>>num;
pb[t].nomber=0;
pb[t++].name=num;}
openfile2.close();
fifo(n);
lru(n);}