# include <stdio.h>
# include <stdlib.h>
# include <iostream.h>
# include <time.h>
# define Bsize 3 //分配給該進程的頁塊數爲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<<"no scarpage"<<endl;
block[exist].timer = -1;//恢復存在的並剛訪問過的BLOCK中頁面TIMER爲-1
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i]; //將PAGE[i]的TIMER設爲0,表示剛剛訪問過
display();
}
else
{
position = findReplace();
block[position] = page[i]; //將PAGE[i]的TIMER設爲0,表示剛剛訪問過
display();
}
}
for(int j=0; j<Bsize; j++)
block[j].timer++;
}
return noscarBsize;
}
int main(void)
{
cout<<"|----------頁 面 置 換 算 法----------|"<<endl;
cout<<"please select:"<<endl;
cout<<"1. applying algorithm LRU"<<endl;
cout<<"0. exit"<<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) ); //srand()函數產生一個以當前時間開始的隨機種子
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 amount of scarpage is:"<<scarBsize<<endl;
f=scarBsize/20.0;
cout<<"the ratio of the scarpage:"<<f<<endl;
test.BlockClear();
cout<<"----------------------"<<endl;
break;
}
default:
cout<<"please input the right number!"<<endl;
break;
}
}
return 0;
}