程序代码:
#include <iostream>
#include <time.h>
#define Bsize 3
#define Psize 12
using namespace std;
int QString[Psize];
void P_String()
{
int i;
srand((unsigned)time(NULL));
for(i=0;i<Psize;i++)
{
QString[i]=rand()*9/RAND_MAX+1;
}
cout<<"页面走向:";
for(i=0;i<Psize;i++)
{
cout<<QString[i]<<" ";
}
cout<<endl;
}
struct pageInfor
{
int content;//页面号
int timer;//被访问标记
};
class Fifo_replace
{
public:
Fifo_replace(void); //构造函数
~Fifo_replace(void); //析构函数
int findSpace(void); //查找是否有空闲内存
int findExist(int curpage); //查找内存中是否有该页面
int findReplace(void); //查找应予置换的页面
void FIFO(void); //FIFO算法
void BlockClear(void); //BLOCK恢复
pageInfor *block; //物理块
pageInfor *page; //页面号串
int memory_state[Bsize][Psize];
int s;
private:
};
Fifo_replace::Fifo_replace(void)
{
int j;
P_String();
s=0;
block = new pageInfor[Bsize];
for(int i=0; i<Bsize; i++) //初始化Block
{
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;
}
for(i=0;i<Psize;i++)
for(j=0;j<Bsize;j++)
memory_state[j][i]=0;
}
Fifo_replace::~Fifo_replace()
{
s=0;
}
int Fifo_replace::findSpace(void)
{
for(int i=0; i<Bsize; i++)
if(block[i].content == -1)
return i;//找到空闲内存,
return -1;
}
int Fifo_replace::findExist(int curpage)
{
for(int i=0; i<Bsize; i++)
if(block[i].content == page[curpage].content)
return i;//找到内存中有该页面,返回BLOCK中位置
return -1;
}
int Fifo_replace::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 Fifo_replace::FIFO(void)
{
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1];
}
s++;
}
else
{
space = findSpace();
if(space != -1)
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1];
}
block[space] = page[i];
memory_state[space][i]=block[space].content;
if(space==1)
{
memory_state[1][0]=0;
memory_state[2][0]=0;
}
else
{
memory_state[2][1]=0;
}
}
else
{
for(int b=0; b<Bsize; b++)
{
memory_state[b][i]=memory_state[b][i-1];
}
position = findReplace();
block[position] = page[i];
memory_state[position][i]=block[position].content;
}
}
for(int j=0; j<Bsize; j++)
block[j].timer++;//BLOCK中所有页面TIMER++
}
}
void Fifo_replace::BlockClear(void)
{
for(int i=0; i<Bsize; i++)
{
block[i].content = -1;
block[i].timer = 0;
}
}
typedef struct page
{
int num; /*记录页面号*/
int time; /*记录调入内存时间*/
}Page; /* 页面逻辑结构,结构为方便算法实现设计*/
Page b[Bsize]; /*内存单元数*/
int c[Bsize][Psize]; /*暂保存内存当前的状态:缓冲区*/
int queue[100]; /*记录调入队列*/
int K; /*调入队列计数变量*/
/*初始化内存单元、缓冲区*/
void Init(Page *b,int c[Bsize][Psize])
{
int i,j;
for(i=0;i<Bsize;i++)
{
b[i].num=-1;
b[i].time=Psize-i-1;
}
for(i=0;i<Bsize;i++)
for(j=0;j<Psize;j++)
c[i][j]=-1;
}
/*取得在内存中停留最久的页面,默认状态下为最早调入的页面*/
int GetMax(Page *b)
{
int i;
int max=-1;
int tag=0;
for(i=0;i<Bsize;i++)
{
if(b[i].time>max)
{
max=b[i].time;
tag=i;
}
}
return tag;
}
/*判断页面是否已在内存中*/
int Equation(int fold,Page *b)
{
int i;
for(i=0;i<Bsize;i++)
{
if (fold==b[i].num)
return i;
}
return -1;
}
/*LRU核心部分*/
void Lru(int fold,Page *b)
{
int i;
int val;
val=Equation(fold,b);
if (val>=0)
{
b[val].time=0;
for(i=0;i<Bsize;i++)
if (i!=val)
b[i].time++;
}
else
{
queue[++K]=fold;/*记录调入页面*/
val=GetMax(b);
b[val].num=fold;
b[val].time=0;
for(i=0;i<Bsize;i++)
if (i!=val)
b[i].time++;
}
}
void main(void)
{
cout<<"|----------页 面 置 换 算 法----------|"<<endl;
cout<<"|-------------------------------------|"<<endl;
cout<<"选 <1>应用FIFO算法"<<endl;
cout<<"选 <2>应用LRU算法"<<endl;
cout<<"选择<0>退出"<<endl;
int select,p,q;
Fifo_replace test;
while(select)
{
cin>>select;
cout<<"你选择的是菜单:"<<select<<endl<<endl;
switch(select)
{
case 0:
cout<<"完成退出。"<<endl;
break;
case 1:
cout<<"FIFO算法状态:"<<endl;
test.FIFO();
test.BlockClear();
cout<<"----------------------"<<endl;
for(p=0;p<Bsize;p++)
{
for(q=0;q<Psize;q++)
cout<<test.memory_state[p][q]<<" ";
cout<<endl;
}
cout<<"----------------------"<<endl;
cout<<"缺页率:"<<Psize-test.s<<"/"<<Psize<<endl<<endl;
test.~Fifo_replace();
cout<<"请选择菜单:"<<endl;
break;
case 2:
int i,j;
char y1;
K=-1;
Init(b, c);
for(i=0;i<Psize;i++)
{
Lru(QString[i],b);
c[0][i]=QString[i];
/*记录当前的内存单元中的页面*/
for(j=0;j<Bsize;j++)
c[j][i]=b[j].num;
}
/*结果输出*/
cout<<"LRU算法状态:"<<endl;
cout<<"----------------------"<<endl;
for(i=0;i<Bsize;i++)
{
for(j=0;j<Psize;j++)
{
if(c[i][j]==-1)
cout<<" 0";
else
cout<<" "<<c[i][j];
}
cout<<" "<<endl;
}
cout<<"----------------------"<<endl;
cout<<"缺页率:"<<K+1<<"/"<<Psize;
cout<<endl;
break;
default:
cout<<"请输入正确菜单号。"<<endl;
break;
}
}
}