內存分配模擬

#include<iostream>
#include<algorithm>
#include<string>
using namespace std;
int src[20] = { 7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1 };
char status[20];
int stay;
int showArray[7][20];
void init()
{
	for (int m = 0;m < 20;m++)
	{
		status[m] = 'N';
	}
	for (int i = 0;i < 7;i++)
	{
		for (int j = 0;j < 20;j++)
		{
			showArray[i][j] = -1;
		}
	}

}
void FIFO_find(int column, int* index,int stay)
{
	for (int i = 0;i < stay;i++)
	{
		showArray[i][column + 1] = showArray[i][column];
	}
	for (int i = 0;i < stay;i++)
	{
		//showArray[i][column + 1] = showArray[i][column];
		if (showArray[i][column] == src[column + 1])//finded
		{
			status[column + 1] = 'Y';
			break;
		}
	}
	if(stay==1)
	{
       if (status[column + 1] == 'N')//not find
	   {
		showArray[0][column+1] = src[column + 1];	
    	}
	}
	else
	{
		if (status[column + 1] == 'N')//not find
		{
			showArray[*index][column + 1] = src[column + 1];
			*index = (*index)++;
			if (*index >= stay) *index = 0;
		}
	}
}
int LRU_find_index(int column, int stay)
{
	int *time = new int[stay];
	for (int i = 0;i < stay;i++)
	{
		time[i] = -1;
	}
	for (int j = 0;j < stay;j++)
	{
		for (int i = 0;i <=column;i++)
		{
			if (showArray[j][column] == src[i])
				time[j] = i;
		}
	}
	int min = time[0];
	int num = 0;
	for (int i = 0;i < stay;i++)
	{
		if (min >=time[i])
		{
			min = time[i];
			num = i;
		}

	}
	int index=num;
	if (min == -1 ) index = column+1;
	return index;
}
void LRU_find(int column,  int stay)
{
	for (int i = 0;i < stay;i++)
	{
		showArray[i][column + 1] = showArray[i][column];
	}
	for (int i = 0;i < stay;i++)
	{
		if (showArray[i][column] == src[column + 1])//finded
		{
			status[column + 1] = 'Y';
			break;
		}
	}
	if (status[column + 1] == 'N')//not find
	{
		int index = LRU_find_index(column, stay);
		showArray[index][column + 1] = src[column + 1];
	}
}
int OPT_find_index(int column, int stay) 
{
	int* time = new int[stay];
	for (int i = 0;i < stay;i++)
	{
		time[i] = 21;
	}
	for (int j = 0;j < stay;j++)
	{
		for (int i =19;i >=column+2;i--)
		{
			if (showArray[j][column] == src[i])
				time[j] = i;
		}
	}
	int max = time[0];
	int num = 0;
	for (int i = 0;i < stay;i++)
	{
		if (max <= time[i])
		{
			max = time[i];
			num = i;
		}
	}
	int index = num;
	for (int i = 0;i < stay;i++)
	{
		if (showArray[i][column] == -1)
		{
			index = i;
			break;
		}
	}
	
	return index;


}
void OPT_find(int column, int stay)
{
	for (int i = 0;i < stay;i++)
	{
		showArray[i][column + 1] = showArray[i][column];
    }
	for (int i = 0;i < stay;i++)
	{
		if (showArray[i][column] == src[column + 1])//finded
		{
			status[column + 1] = 'Y';
			break;
		}
	}
	if (status[column + 1] == 'N')//not find
	{
		int index = OPT_find_index(column, stay);
		showArray[index][column + 1] = src[column + 1];
	}

}
void dis(int stay)
{
	for (int i = 0;i < 20;i++)
	{
		cout << src[i] << " ";
	}
	cout << endl;
	cout << "---------------------------------------" << endl;
	for (int row = 0;row < stay;row++)
	{
		for (int col = 0;col < 20;col++)
		{
			if (showArray[row][col] != -1)
				cout << showArray[row][col] << " ";
			else
			{
				cout << "  ";
			}
		}
		cout << endl;
	}
	cout << "---------------------------------------" << endl;
	int miss=0;
	for (int i = 0;i < 20;i++)
	{
		if (status[i] == 'N') miss++;
		cout << status[i] << " ";
	}
	cout << endl;
	cout << "The number of missing pages is :" << miss << endl;
	cout << "The rate of missing pages is :" <<  double(miss) / 0.2 <<"%"<< endl;
	cout << "=======================================" << endl;
	cout << "=======================================" << endl;
}
void FIFO(int stay)
{
	init();
	cout << "           **********FIFO**********      " << endl;
	cout << "---------------------------------------" << endl;
	showArray[0][0] = src[0];
	int index = 1;
	for (int i = 1;i < 20;i++)
	{
		FIFO_find(i - 1, &index,stay);
	}
	//dis();
}
void LRU(int stay)
{
	init();
	cout << "           **********LRU**********      " << endl;
	cout << "---------------------------------------" << endl;
	showArray[0][0] = src[0];
	int index;
	for (int i = 1;i < 20;i++)
	{
		LRU_find(i - 1,  stay);
	}

}
void OPT(int stay)
{

	init();
	cout << "           **********OPT**********      " << endl;
	cout << "---------------------------------------" << endl;
	showArray[0][0] = src[0];
	int index;
	for (int i = 1;i < 20;i++)
	{
		OPT_find(i - 1, stay);
	}
}
int main()
{  
	for (int i = 1;i <= 7;i++)
	{
		cout << "           **********OPT**********      " << endl;
	stay = i;
    FIFO(stay);
	dis(stay);
	LRU(stay);
	dis(stay);
	OPT(stay);
	dis(stay);
	cout << "           ***********駐留集爲"<< to_string(i)   << "*********      " << endl;
	}
	
	//cout << showArray[1][1] << endl;
}




 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章