FIFO 先进先出页面置换算法
根据作业序列判断置换,先进先置换的原则。
实现过程:
用vector简单模拟这个过程,不用直接queue模拟,是因为,当判断是否需要置换的时候,queue不好判断在队列中是否存在这个数。vector就方便很多。用一个二维数组存下过程的产生的置换图,换面好输出。
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,m;
vector<int> num;
cout<<"请输入作业序列(输入-1停止输入)"<<endl;
int x;
while(cin>>x){
if(x==-1) break;
num.push_back(x);
}
n=num.size();
cout<<"请输入物理块数: ";
cin>>m;
cout<<endl;
cout<<"页面总数 "<<n<<"物理块数 "<<m<<endl<<endl;
vector<int> q;
int count=0;
vector<bool>vis(n,0);
vector<vector<int> > ans(n,vector<int> (m,-1));
for(int i=0;i<n;i++){
int ok=false;
if(q.size()<m){
q.push_back(num[i]);
count++;
vis[i]=1;
}
else{
for(int j=0;j<q.size();j++){
if(q[j]==num[i]) {
ok=true;
break;
}
}
if(!ok){
q.erase(q.begin());
q.push_back(num[i]);
vis[i]=1;
count++;
}
}
for(int j=0;j<q.size();j++){
ans[i][j]=q[j];
}
}
cout<<"FIFO: "<<endl;
cout<<"作业序列 ";
for(int i=0;i<n;i++) cout<<num[i]<<" ";
cout<<endl<<endl;
for(int i=0;i<m;i++){
if(i==0){
cout<<"最开始的 ";
}else if(i==m-1){
cout<<"最末尾的 ";
}
else cout<<" ";
for(int j=0;j<n;j++){
if(ans[j][i]==-1) cout<<" ";
else cout<<ans[j][i]<<" ";
}
cout<<endl<<endl;
}
cout<<"是否置换 ";
for(int i=0;i<n;i++){
if(vis[i]) cout<<"X ";
else cout<<" ";
}
cout<<endl<<endl;
cout<<"置换率为 "<< count*1.0/n<<endl;
}
|