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;
}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM