vmrp.h
/*
* Filename : vmrp.h
* copyright : (C) 2006 by zhonghonglie
* Function : 澹版槑铏氭嫙鍐呭瓨椤电疆鎹㈢被
*/
#ifndef VMRP_H
#define VMRP_H
#include <iostream>
#include <iomanip>
#include <malloc.h>
using namespace std;
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); // 鏈€缁忓父浣跨敤缃崲绠楁硶
void GenerateRandomRef(int size, int max_page); // 鏂板闅忔満鐢熸垚鏂规硶
private:
int *ReferencePage; // 瀛樻斁瑕佽闂埌鐨勯〉鍙?
int *EliminatePage; // 瀛樻斁娣樻卑椤靛彿
int *PageFrames; // 瀛樻斁褰撳墠姝e湪瀹炲瓨涓殑椤靛彿
int *Referencebit; // 寮曠敤浣嶆暟缁?
int *Modifybit; // 淇敼浣嶆暟缁?
int *count; // 浣跨敤璁℃暟鏁扮粍
int maxPage; // 鏂板鏈€澶ч〉鍙锋垚鍛?
int PageNumber; // 璁块棶椤垫暟
int FrameNumber; // 瀹炲瓨甯ф暟
int FaultNumber; // 澶辫触椤垫暟(缂洪〉鏁?
};
#endif // VMRP_H
prac7.h
#include "vmrp.h"
#include <cstdlib>
#include <ctime>
Replace::Replace() {
int i;
srand(time(NULL));
cout << "Please input page numbers (0 for random): ";
cin >> PageNumber;
if(PageNumber == 0) {
cout << "Input max page number: ";
cin >> maxPage;
cout << "Input page frames: ";
cin >> FrameNumber;
PageNumber = 10 + rand() % 11;
GenerateRandomRef(PageNumber, maxPage);
} else {
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()
{
delete[] ReferencePage;
delete[] EliminatePage;
delete[] PageFrames;
delete[] Referencebit;
delete[] count;
delete[] Modifybit;
}
//随机生成
void Replace::GenerateRandomRef(int size, int max_page) {
PageNumber = size;
maxPage = max_page;
ReferencePage = new int[sizeof(int) * PageNumber];
EliminatePage = new int[sizeof(int) * PageNumber];
cout << "Generated reference string: ";
for(int i = 0; i < PageNumber; i++) {
ReferencePage[i] = 1 + rand() % max_page;
cout << ReferencePage[i] << " ";
}
cout << endl;
}
void Replace::InitSpace(char * MethodName)
{
int i;
cout << endl << MethodName << endl;
FaultNumber=0;
for (i = 0; i < PageNumber; i++)
EliminatePage[i] = -1;
for(i = 0; i < FrameNumber; i++)
{
PageFrames[i] = -1;
Referencebit[i]=0;
count[i]=0;
Modifybit[i]=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
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;
}
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,k,l,next;
InitSpace("Clock");
int pointer = 0;
for(k=0,l=0; k < PageNumber; k++)
{
next=ReferencePage[k];
//妫€娴嬪紩鐢ㄩ〉褰撳墠鏄惁宸插湪瀹炲瓨
for (i=0; i<FrameNumber; i++)
if(next==PageFrames[i])
{
Referencebit[i]=1;
break;
}
if (i<FrameNumber)
{
for(i=0; i<FrameNumber; i++)
cout << PageFrames[i] << " ";
cout << endl;
continue;
}
FaultNumber++;
//瀵绘壘鍙浛鎹㈢殑椤甸潰
while(Referencebit[pointer] == 1) {
Referencebit[pointer] = 0;
pointer = (pointer + 1) % FrameNumber;
}
EliminatePage[l]=PageFrames[pointer];
PageFrames[pointer]=next;
Referencebit[pointer]=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;
pointer = (pointer + 1) % FrameNumber;
}
Report();
}
void Replace::Eclock(void)
{
int i,k,l,next;
InitSpace("EClock");
int pointer = 0;
for(k=0,l=0; k < PageNumber; k++)
{
next=ReferencePage[k];
//妫€娴嬪紩鐢ㄩ〉褰撳墠鏄惁宸插湪瀹炲瓨
for (i=0; i<FrameNumber; i++)
if(next==PageFrames[i])
{
Referencebit[i]=1;
// 50%姒傜巼璁剧疆淇敼浣?
if(rand() % 2) Modifybit[i] = 1;
break;
}
if (i<FrameNumber)
{
for(i=0; i<FrameNumber; i++)
cout << PageFrames[i] << " ";
cout << endl;
continue;
}
FaultNumber++;
// 瀵绘壘鍙浛鎹㈢殑椤甸潰 (鎸夌収(0,0),(0,1),(1,0),(1,1)鐨勯『搴?
int found = 0;
for(int pass = 0; pass < 2 && !found; pass++) {
for(i = 0; i < FrameNumber && !found; i++) {
int idx = (pointer + i) % FrameNumber;
if(Referencebit[idx] == pass && Modifybit[idx] == 0) {
pointer = idx;
found = 1;
break;
}
}
if(!found) {
for(i = 0; i < FrameNumber && !found; i++) {
int idx = (pointer + i) % FrameNumber;
if(Referencebit[idx] == pass) {
pointer = idx;
found = 1;
break;
}
}
}
}
EliminatePage[l]=PageFrames[pointer];
PageFrames[pointer]=next;
Referencebit[pointer]=1;
Modifybit[pointer]=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;
pointer = (pointer + 1) % FrameNumber;
}
Report();
}
void Replace::Lfu(void)
{
int i,k,l,next;
InitSpace("Lfu");
for(k=0,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=1; 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,k,l,next;
InitSpace("Mfu");
for(i=0; i<FrameNumber; i++)
count[i]=1;
for(k=0,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=1; 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();
delete vmpr;
return 0;
}
Makefile
CXX = g++
CXXFLAGS = -Wall -g -std=c++11
HEADER = vmrp.h
SRC = prac7.c
OBJ = prac7.o
TARGET = prac7
all: $(TARGET)
$(TARGET): $(OBJ)
$(CXX) $(CXXFLAGS) -o $@ $^
$(OBJ): $(SRC) $(HEADER)
$(CXX) $(CXXFLAGS) -c $<
clean:
rm -f $(OBJ) $(TARGET)
.PHONY: all clean