vmrp.h:
#include <iostream>
#include <iomanip>
#include <malloc.h>
class Replace{
public:
Replace();
~Replace();
void InitSpace(char * MethodName); //初始化页号记录
void Report(void); //报告算法执行情况
void Fifo(void); //先进出算法
void Lru(void); //最近旧未用算法
void Clock(void); //时钟 (二次机会)置换算法
void Eclock(void); //增强二次机会置换算法
void Lfu(void); //最不经常使用置换算法
void Mfu(void); //最经常使用置换算法
private:
int * ReferencePage ; //存放要访问到的页号
int * EliminatePage ; //存放淘汰页号
int * PageFrames ; //存放当前正在实存中的页号
int PageNumber; //访问页数
int FrameNumber; //实存帧数
int FaultNumber; //失败页数
int * Referencebit;//引用位
int * Modifybit;//修改位
int * count;
};
vmrp.cc:
#include "vmrp.h"
using namespace std;
Replace::Replace(){
int i; //设定总得访问页数,并分配相应的引用页号和淘汰页号记录数组空间
cout << "Please input page numbers :" ;
cin >> PageNumber;
ReferencePage = new int[sizeof(int) * PageNumber];
EliminatePage = new int[sizeof(int) * PageNumber];
//输入引用页号序列(页面走向),初始化引用页数组
cout << "Please input reference page string :";
for (i = 0; i < PageNumber; i++)
cin >> ReferencePage[i];//引用页暂存引用数组
//设定内存实页数(帧数),并分配相应的实页号记录数组空间(页号栈)
cout << "Please input page frames :";
cin >> FrameNumber;
PageFrames = new int[sizeof(int) * FrameNumber];
Referencebit = new int[sizeof(int) * FrameNumber];
count = new int[sizeof(int) * FrameNumber];
Modifybit = new int[sizeof(int) * FrameNumber];
}
Replace::~Replace(){
}
void Replace::InitSpace(char * MethodName)
{
int i;
cout << endl << MethodName << endl;
FaultNumber=0; //引用还未开始,-1表示无引用页
for (i = 0; i < PageNumber; i++)
EliminatePage[i] = -1;
for(i = 0; i < FrameNumber; i++){
PageFrames[i] = -1;//存放当前正在实存中的页号
Referencebit[i]=0;//未被使用引用位设置为0
count[i]=0;//计数
Modifybit[i]=0;//修改位初始为0
}
}
//分析统计选择的算法对于当前输入的页面走向的性能
void Replace::Report(void){
//报告淘汰页顺序
cout << endl << "Eliminate page:";
for(int i=0; EliminatePage[i]!=-1; i++)
cout << EliminatePage[i] << " ";
//报告缺页数和缺页率
cout << endl << "Number of page faults = " << FaultNumber << endl;
cout << setw(6) << setprecision(3) ;
cout << "Rate of page faults = "<< 100*(float)FaultNumber/(float)PageNumber << "%" <<endl;
}
//最近最旧未用置换算法
void Replace::Lru(void)
{
int i,j,k,l,next;
InitSpace("LRU"); //循环装入引用页
for(k=0,l=0; k < PageNumber; k++){
next=ReferencePage[k];
//检测引用页当前是否已在实存
for (i=0; i<FrameNumber; i++){
if(next == PageFrames[i]){
//引用页已在实存将其调整到页记录栈顶
next= PageFrames[i];
for(j=i;j>0;j--) PageFrames[j] = PageFrames[j-1];
PageFrames[0]=next;
break;
}
}
if(PageFrames[0] == next){
//如果引用页已放栈顶,则为不缺页,报告当前内存页号
for(j=0; j<FrameNumber; j++)
if(PageFrames[j]>=0) cout << PageFrames[j] << " ";
cout << endl;
continue; //继续装入下一页
}
else
// 如果引用页还未放栈顶,则为缺页,缺页数加1
FaultNumber++;
//栈底页号记入淘汰页数组中
EliminatePage[l] = PageFrames[FrameNumber-1];
//向下压栈
for(j=FrameNumber-1;j>0;j--) PageFrames[j]= PageFrames[j-1];
PageFrames[0]=next; //引用页放栈顶
//报告当前实存中页号
for(j=0; j<FrameNumber; j++)
if(PageFrames[j]>=0) cout << PageFrames[j] << " ";
//报告当前淘汰的页号
if(EliminatePage[l]>=0)
cout << "->" << EliminatePage[l++] << endl;
else
cout << endl;
}
//分析统计选择的算法对于当前引用的页面走向的性能
Report();
}
//先进先出置换算法
void Replace::Fifo(void){
int i,j,k,l,next;
InitSpace("FIFO");
//循环装入引用页
for(k=0,j=l=0; k < PageNumber; k++){
next=ReferencePage[k];
//如果引用页已在实存中,报告实存页号
for (i=0; i<FrameNumber; i++) if(next==PageFrames[i]) break;
if (i<FrameNumber){
for(i=0; i<FrameNumber; i++) cout << PageFrames[i] << " ";
cout << endl;
continue; // 继续引用下一页
}
//引用页不在实存中,缺页数加1
FaultNumber++;
EliminatePage[l]= PageFrames[j]; //最先入页号记入淘汰页数组
PageFrames[j]=next; //引用页号放最先入页号处
j = (j+1)%FrameNumber; //最先入页号循环下移
//报告当前实存页号和淘汰页号
for(i=0; i<FrameNumber; i++)
if(PageFrames[i]>=0) cout << PageFrames[i] << " ";
if(EliminatePage[l]>=0)
cout << "->" << EliminatePage[l++] << endl;
else
cout << endl;
}
//分析统计选择的算法对于当前引用的页面走向的性能
Report();
}
//未实现的其他页置换算法入口
//时钟(二次机会)置换算法
void Replace::Clock(void){
int i,j,k,l,next;
InitSpace("Clock");
//循环装入引用页
for(k=0,j=l=0; k <PageNumber; k++){
next=ReferencePage[k];
for(i=0; i<FrameNumber; i++)
//检测引用页当前是否已在实存
if(next==PageFrames[i]){
Referencebit[i]=1;//引用位设置为1
break;
}
if(i<FrameNumber){
for(i=0; i<FrameNumber; i++)
cout<<PageFrames[i] << " ";
cout<<endl;
continue;
}
if(Referencebit[j]==1){
Referencebit[j]==0;//如果引用位为1,重新设置成0
}
EliminatePage[l]=PageFrames[j];//最先入页号记入淘汰页数组
PageFrames[j]=next; //引用页号放最先入页号处
Referencebit[j]=1;//引用位设置为1
FaultNumber++;//缺页数加1
j=(j+1)%FrameNumber;//最先入页号循环下移
for(i=0; i<FrameNumber; i++)
if(PageFrames[i]>=0)
cout<<PageFrames[i] << " ";
if(EliminatePage[l]>=0)
cout<< "->" <<EliminatePage[l++] <<endl;
else
cout<<endl;
}
//分析统计选择的算法对于当前输入的页面走向的性能
Report();
}
//增强二次机会置换算法
void Replace::Eclock (void){
int i,j,k,l,next;
InitSpace("EClock");
//循环装入引用页
for(k=0,j=l=0; k <PageNumber; k++){
next=ReferencePage[k];
//循环装入引用页
for (i=0; i<FrameNumber; i++)
//检测引用页当前是否已在实存
if(next==PageFrames[i]){
Referencebit[i]=1;//引用位设置为1
count[i]++;
//如果被引用了两次,就把修改位设置成1
if(count[i]%2==0)
Modifybit[i]=0;//修改位设置为0
else
Modifybit[i]=1;
break;
}
if(i<FrameNumber){
for(i=0; i<FrameNumber; i++)
cout<<PageFrames[i] << " ";
cout<<endl;
continue;
}
if(Referencebit[j]==1)
Referencebit[j]==0;
if(Modifybit[j]==1)
Modifybit[j]=0;
int min=10*Referencebit[j]+Modifybit[j];
int index=j;
for(i=0;i<FrameNumber;i++){
if(10*Referencebit[i]+Modifybit[i]<min){
min=10*Referencebit[i]+Modifybit[i];
index=i;
}
}
EliminatePage[l]=PageFrames[index];
PageFrames[index]=next;
Referencebit[index]=0;
Modifybit[index]=1;
count[index]=0;
FaultNumber++;//引用页不在实存中,缺页数加1
j=(j+1)%FrameNumber;//最先入页号循环下移
for(i=0; i<FrameNumber; i++)
if(PageFrames[i]>=0)
cout<<PageFrames[i] << " ";
if(EliminatePage[l]>=0)
cout<< "->" <<EliminatePage[l++] <<endl;
else
cout<<endl;
}
//分析统计选择的算法对于当前输入的页面走向的性能
Report();
}
//最不经常使用置换算法
void Replace::Lfu(void){
int i,j,k,l,next;
InitSpace("Lfu");
//循环装入引用页
for(k=0,j=l=0; k <PageNumber; k++){
next=ReferencePage[k];
for(i=0; i<FrameNumber; i++)
if(next==PageFrames[i]){
count[i]++;//记录使用次数
break;
}
if(i<FrameNumber){
for(i=0; i<FrameNumber; i++)
cout<<PageFrames[i] << " ";
cout<<endl;
continue;
}
FaultNumber++;
int min=count[0];
int index=0;
for(i=0;i<FrameNumber;i++){
if(count[i]<min){
min=count[i];
index=i;
}
}
EliminatePage[l]= PageFrames[index];//最不经常使用的页号记入淘汰页数组
PageFrames[index]=next;
count[index]=1;
for(i=0; i<FrameNumber; i++)
if(PageFrames[i]>=0)
cout<<PageFrames[i] << " ";
if(EliminatePage[l]>=0)
cout<< "->" <<EliminatePage[l++] <<endl;
else
cout<<endl;
}
//分析统计选择的算法对于当前输入的页面走向的性能
Report();
}
//最经常使用置换算法
void Replace::Mfu(void){
int i,j,k,l,next;
InitSpace("Mfu");
for(i=0;i<FrameNumber;i++)
count[i]=1;
//循环装入引用页
for(k=0,j=l=0; k<PageNumber; k++){
next=ReferencePage[k];
for (i=0; i<FrameNumber; i++)
if(next==PageFrames[i]){
count[i]++;
break;
}
if (i<FrameNumber){
for(i=0; i<FrameNumber; i++)
cout<<PageFrames[i] << " ";
cout<<endl;
continue;
}
FaultNumber++;
int max=count[0];
int index=0;
for(i=0;i<FrameNumber;i++){
if(count[i]>max){
max=count[i];
index=i;
}
}
EliminatePage[l]=PageFrames[index];
PageFrames[index]=next;
count[index]=0;
for(i=0; i<FrameNumber; i++)
if(PageFrames[i]>=0)
cout<<PageFrames[i] << " ";
if(EliminatePage[l]>=0)
cout<< "->" <<EliminatePage[l++] <<endl;
else
cout<<endl;
}
//分析统计选择的算法对于当前输入的页面走向的性能
Report();
}
int main(int argc,char *argv[]){
Replace * vmpr = new Replace();
vmpr->Lru();
vmpr->Fifo();
vmpr->Clock();
vmpr->Eclock();
vmpr->Lfu();
vmpr->Mfu();
return 0;
}
Makefile:
head = vmrp.h
srcs = vmrp.cc
objs = vmrp.o
opts = -w -g -c
all: vmrp
vmrp: $(objs)
g++ $(objs) -o vmrp
vmrp.o: $(srcs) $(head)
g++ $(opts) $(srcs)
clean:
rm vmrp *.o