📄 fifolru.cpp
字号:
//文件FIFOLRU.cpp
#include"FIFOLRU.h"
#include<iomanip.h> //为下面调用setw()函数作声明
void StoreM::Input1()
{ ap1=1; //标志着有输入页框数
cout<<endl<<"请输入作业的页框数:";
cin>>N;
page=new Pro[N];
}
void StoreM::Input2()
{ ap2=1; //标志着有输入页面走向
cout<<endl<<"请输入该作业的页面走向的总个数:";
do
{ cin>>m;
if(m>M) //已经定义了最大,所以不能超过最大的页号数
cout<<endl<<"总页面数太多,请重试!"<<endl;
else
break;
}while(1);
cout<<endl<<"请输入此作业的页面走向:";
for(int i=0;i<m;i++)
{ cin>>P[i].content;
P[i].time=0; //令其对应的页面号在内存中的时间为0
}
}
void StoreM::BlockClear() //逐个的初始化页面的基本情况
{ for(int i=0;i<N;i++)
{ page[i].content=-1;
page[i].time=0;
}
}
void StoreM::Display(int a,int b) //显示被置换和被修改的页面
{ for(int i=0;i<N;i++)
cout<<setw(3)<<page[i].content<<" ";
if(a!=-1)
cout<<" "<<b<<" 置换出上一个的 "<<a;
cout<<endl;
}
int StoreM::Search(int e)
{ for(int i=0;i<N;i++) //逐个从页面中查找是否与传值下来的页号相匹配
if(e==page[i].content)
return i; //找到了就返回其下标
return -1; //没找到就返回-1
}
int StoreM::Max() //在页面中查找离现在时间最长的页面
{ int e=page[0].time;
for(int i=0;i<N;i++) //逐个在页面中找在页面的时间最长
if(e<page[i].time)
e=page[i].time;
for(i=0;i<N;i++) //如果有就返回其下标
if(e==page[i].time)
return i;
return -1; //没有就返回-1
}
void StoreM::FIFO()
{ int i=0,t=0,ne; //i是作输入的页号的下标,t作页面的下标,ne用来储存没有置换前的页面的页号
float count=0; //计量总的缺业个数,初值为0
if(ap1==1&&ap2==1) //表示有输入页框数和页面走向
{ cout<<endl<<"以下是FIFO(先进先出)算法页面置换情况及被修改的信息!"<<endl;
while(i<m) //在P中逐个遍历所有的页号
{ if(Search(P[i].content)>=0)
i++;
else
{ if(t==N) t=0; //t到了末尾就令它到首位
else
{ count++; //表示有缺业情况计量就加1
ne=page[t].content; //储存置换前的页面的页号
page[t].content=P[i].content; //置换相应的页号
Display(ne,P[i].content); //显示相关信息
t++; //下标移向下一个
}
}
}
cout<<endl<<"缺业次数为:"<<count<<" 缺业率为:"<<count/m<<endl<<endl;
}
else //没有输入页框数和页面走向就提示没有输入相关信息
cout<<endl<<"!!!想查询FIFO页面置换算法,请先确定页框数及页面走向都输入了!!!"<<endl<<endl;
}
void StoreM::LRU()
{ int t,ne; //t用来接收在页面中查找是否有相同的页号的返回值,ne用来储存没有置换前的页面的页号
float count=0; //计量总的缺业个数,初值为0
if(ap1==1&&ap2==1) //表示有输入页框数和页面走向
{ cout<<endl<<"以下是LRU(最近最久未使用)算法页面置换情况及被修改的信息!"<<endl;
for(int i=0;i<m;i++) //在P中逐个遍历所有的页号
{ t=Search(P[i].content);
if(t>=0) //找到了就令其在内存中的时间为0
page[t].time=0;
else
{ count++; //表示有缺业情况计量就加1
t=Max(); //在页面中找离现在时间最久的页号下标
ne=page[t].content; //储存置换前的页面的页号
page[t].content=P[i].content; //置换相应的页号
Display(ne,P[i].content); //显示相关信息
page[t].time=0; //用完了就令对应在内存的时间为0
}
for(int j=0;j<t;j++) //不是离现在时间最久的页号对应的时间就相应的加1
page[j].time++;
for(j=t+1;j<N;j++)
page[j].time++;
}
cout<<endl<<"缺业次数为:"<<count<<" 缺业率为:"<<count/m<<endl<<endl;
}
else //没有输入页框数和页面走向就提示没有输入相关信息
cout<<endl<<"!!!想查询LRU页面置换算法,请先确定页框数及页面走向都输入了!!!"<<endl<<endl;
}
⌨️ 快捷键说明
复制代码
Ctrl + C
搜索代码
Ctrl + F
全屏模式
F11
切换主题
Ctrl + Shift + D
显示快捷键
?
增大字号
Ctrl + =
减小字号
Ctrl + -