#include<stdlib.h>
#include<time.h>
#include <iostream>
#define Bsize 3 //页面块数
#define Psize 20
using namespace std;
struct pageInfor
{
int ID; //页面号
int visit; //被访问标记
};
pageInfor * block; //物理块
pageInfor * page; //页面号串
class SWM
{
private:
int i;
int count;
public:
//置初值
void BlockClear()
{
for(int i=0; i<Bsize; i++)
{
block[i].ID = -1;
block[i].visit = 0;
}
}
//初始化
void inital()
{
int QString[Psize]={0};
srand(time(0));
for(int i=0;i<20;i++)
{
QString[i]=rand()%10;
printf("%d",QString[i]);
}
cout<<endl;
block = new pageInfor[Bsize];
BlockClear();
page = new pageInfor[Psize];
for(i=0; i<Psize; i++)
{
page[i].ID = QString[i];
page[i].visit = 0;
}
}
//查找是否有空闲内存
int findSpace()
{
for(int i=0; i<Bsize; i++)
if(block[i].ID == -1)
return i;//找到空闲内存,返回BLOCK中位置
return -1;
}
//查找内存中是否有该页面
int findExist(int curpage)
{
for(int i=0; i<Bsize; i++)
if(block[i].ID == page[curpage].ID)
return i;//找到内存中有该页面,返回BLOCK中位置
return -1;
}
//查找应予置换的页面
int findReplace()
{
int pos = 0;
for(int i=0; i<Bsize; i++)
if(block[i].visit >= block[pos].visit)
pos = i;//找到应予置换页面,返回BLOCK中位置
return pos;
}
//显示
void display()
{
cout<<"\n";
for(int i=0; i<Bsize; i++)
if(block[i].ID != -1)
cout<<block[i].ID<<" ";
cout<<endl;
cout<<"\n";
}
//FIFO算法
void FIFO()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
count++;
}
}
for(int j=0; j<Bsize; j++)
block[j].visit++;//BLOCK中所有页面visit++
}
cout<<"\nFIFO算法的缺页率是:"<<(float)count/20<<endl;
}
//LRU算法
void LRU()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;;
block[exist].visit = -1;//恢复存在的并刚访问过的BLOCK中页面visit为-1
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
count++;
}
}
for(int j=0; j<Bsize; j++)
{
block[j].visit++;
}
}
cout<<"\n LRU算法的缺页率是:"<<(float)count/20<<endl;
}
//OPT算法
void OPT()
{
count=0;
int exist,space,position ;
for(int i=0; i<Psize; i++)
{
exist = findExist(i);
if(exist != -1)
{
cout<<"即将访问的是页面"<<page[i].ID<<endl;
cout<<"内存中已存在该页"<<endl;
}
else
{
space = findSpace();
if(space != -1)
{
block[space] = page[i];
display();
}
else
{
for(int k=0; k<Bsize; k++)
for(int j=i; j<Psize; j++)
{
if(block[k].ID != page[j].ID)
{
block[k].visit = 1000;
}
else
{
block[k].visit = j;
break;
}
}
position = findReplace();
cout<<"即将访问的是页面"<<page[i].ID<<"\n将被置换出的是页面"<<block[position].ID<<endl;
block[position] = page[i];
display();
}
}
}
}
};
void main()
{
int ch;
SWM test;
printf("\t\t 页面置换算法 \n");
printf("\t\t 虚拟内存 \n");
printf("\t\t 1、产生随机序列 \n");
printf("\t\t 2、最久未使用(LRU) \n");
printf("\t\t 3、先进先出(FIFO) \n");
printf("\t\t 4、最佳置换算法(OPT) \n");
// printf("\t\t 5、三种算法的比较()
// cout<<"计算机随机产生一组种子:";
// test.inital();
while(ch)
{
cin>>ch;
switch(ch)
{
case 1:
cout<<"计算机随机产生一组种子:";
test.inital();
test.BlockClear();
cout<<endl;
cout<<"进程块数是3"<<endl;
cout<<"请选择算法"<<endl;
break;
case 2:
cout<<"LRU:"<<endl;
test.LRU();
test.BlockClear();
cout<<endl;
break;
case 3:
cout<<"FIFO:"<<endl;
test.FIFO();
test.BlockClear();
cout<<endl;
break;
case 4:
cout<<"LRU:"<<endl;
test.OPT();
test.BlockClear();
cout<<endl;
break;
default:
cout<<"ERROR COMMAND!"<<endl;
getchar();
break;
}
}
}