オペレーティングシステムページ置換アルゴリズムのFIFO,LRU
2658 ワード
#include
#include
#include
#include
#include
#include
#include
#include
using namespace std;
const int total_i = 10;
const int mf1 = 3;
const int mf2 = 4;
vector access_series(total_i);
int firstEmpty(vector& v,int n)
{
for(int i = 0;i < n;++i)
if(v[i] == -1)
return i;
return -1;
}
int getLen()
{
int index = 0;
vector v = access_series;
sort(v.begin(),v.end());
for(int i = 0;i < total_i;++i)
{
if (v[index] != v[i])
v[++index] = v[i];
}
return index + 1;
}
int getLeast(vector& v,int n)
{
int min = v[0];
int position = 0;
for(int i = 0;i < n;++i)
{
if(v[i] != 0 && v[i] < min)
{
min = v[i];
position = i;
}
}
return position;
}
void change(vector& state,int size)
{
for(int k = 0;k < size;++k)
if(state[k] != -1)
state[k] >>= 1;
}
void FIFO(int n)
{
int miss = 0;
vector v(n,-1);
for(int i = 0;i < total_i;++i)
{
bool flag = false;
for(int j = 0;j < n;++j)
{
if(v[j] == access_series[i])
{
flag = true;
break;
}
}
if(!flag)
{
++miss;
for(int k = 0;k < n - 1;++k)
v[k] = v[k + 1];
v[n - 1] = access_series[i];
}
copy(v.begin(),v.end(),ostream_iterator(cout," "));
cout< v(n,-1);
int size = getLen();
vector state(size,0);
for(int i = 0;i < total_i;++i)
{
int pos = -1;
for(int j = 0;j < n;++j)
{
if(v[j] == access_series[i])
{
pos = j;
break;
}
}
if(pos == -1)//not found
{
++miss;
int p = firstEmpty(v,n);
if(p != -1)//has empty position
{
change(state,size);
v[p] = access_series[i];
state[p] = pow(2,size - 1);
}
else
{
change(state,size);
int p1 = getLeast(state,size);
v[p1] = access_series[i];
state[p1] = pow(2,size - 1);
}
}
else
{
change(state,size);
//state[pos] >>= 1;
state[pos] += pow(2,size - 1);
}
copy(v.begin(),v.end(),ostream_iterator(cout," "));
cout<>access_series[i];
copy(access_series.begin(),access_series.end(),ostream_iterator(cout," "));
cout<