LRU算法

#include <stdio.h>

#include <stdlib.h>

#include <iostream.h>

#include <time.h>

 



#define Bsize 3

#define Psize 20



struct pageInfor

{

	int content;//页面号

	int timer;//被访问标记

};



class LRU

{

	public:

		LRU(int qstring[]);

		int findSpace(void);//查找是否有空闲内存

		int findExist(int curpage);//查找内存中是否有该页面

		int findReplace(void);//查找应予置换的页面

		void display(void);//显示

		int  LRUpro(void);//LRU算法

		void BlockClear(void);//BLOCK恢复

		pageInfor * block;//物理块

		pageInfor * page;//页面号串

};



LRU::LRU(int qstring[])

{

	int i;

	block = new pageInfor[Bsize];

	for(i=0; i<Bsize; i++)

	{

		block[i].content = -1;

		block[i].timer = 0;

	}



	page = new pageInfor[Psize];

	for(i=0; i<Psize; i++)

	{

		page[i].content = qstring[i];

		page[i].timer = 0;

	}

}





int LRU::findSpace(void)

{

	for(int i=0; i<Bsize; i++)

		if(block[i].content == -1)

			return i;//找到空闲内存,返回BLOCK中位置

	return -1;

}



int LRU::findExist(int curpage)

{



	for(int i=0; i<Bsize; i++)

		if(block[i].content == page[curpage].content)

			return i;//找到内存中有该页面,返回BLOCK中位置

	return -1;

}



int LRU::findReplace(void)

{

	int pos = 0;



	for(int i=0; i<Bsize; i++)

	if(block[i].timer >= block[pos].timer)

		pos = i;//找到应予置换页面,返回BLOCK中位置

	return pos;

}



void LRU::display(void)

{

	for(int i=0; i<Bsize; i++)

	if(block[i].content != -1)

		cout<<block[i].content<<" ";

	cout<<endl;

}



void LRU::BlockClear(void)

{

	for(int i=0; i<Bsize; i++)

	{

		block[i].content = -1;

		block[i].timer = 0;

	}

}





int LRU::LRUpro(void)

{

	int exist,space,position ;

	int noscarBsize=0;



	for(int i=0; i<Psize; i++)

	{

		exist = findExist(i);

		if(exist != -1)

		{

			noscarBsize++;

			cout<<"不缺页"<<endl;

			block[exist].timer = -1;//恢复存在的并刚访问过的BLOCK中页面TIMER为-1

		}

  		else

  		{

   			space = findSpace();

   			if(space != -1)

   			{

    			block[space] = page[i];

    			display();

   			}

   			else

   			{

    			position = findReplace();

    			block[position] = page[i];  

    			display();

   			}

  		}

  		for(int j=0; j<Bsize; j++)

   			block[j].timer++;

 	}

	return noscarBsize;

}



/*在linux下用gcc编译时,使用gcc lru3.cpp -lstdc++*/ 





int main(void)

{

	cout<<"|----------页 面 置 换算法----------|"<<endl;

	cout<<"|---please seect:---|"<<endl;

	cout<<"|-----1:LRU--------|"<<endl;

	cout<<"|-------0 :exit------|"<<endl;

 	cout<<"|-------------------------------------|"<<endl;

 

 	int select;

	int i,scarBsize=0;

	float f;

	int qstring[20];

 

 	while(select)

 	{

  		cin>>select;

  		switch(select)

  		{

   			case 0:

    			break;

   			case 1:

   			{

			   	

				cout<<"the amount of page block is 3:"<<endl;

				cout<<"produce the sequence of 20 length randomly:"<<endl ;

				srand((unsigned)time(NULL));

				for(i=0;i<Psize;i++)

				{

					if(!(i%10))

		 				cout<<endl;

						qstring[i]= rand() % 8;

						cout<<"*"<<qstring[i];

				}

    			cout<<endl;

				LRU test(qstring);

				cout<<"the result of LRU algorithm is"<<endl;

				scarBsize=20-test.LRUpro();

				cout<<"the amout of scarpage is"<<scarBsize<<endl;

				f=scarBsize/20.0;

				cout<<"the ratio of the  is"<<f<<endl;

    			test.BlockClear();

    			cout<<"----------------------"<<endl;

				break;

  			}	

   			default:

    			cout<<"请输入正确功能号"<<endl;

    			break;

  		}

 	}

 	return 0;

}

  

你可能感兴趣的:(LRU)