オペレーティングシステムページ置換アルゴリズムのFIFO,LRU


#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<