算法过程:
在内存块初始化后,取出页面访问序列队列的队头。首先判断内存块中是否已经存在该队头页面,如果存在则直接显示内存块当前情况;否则,判断此时内存是否已满。如果内存未满,循环遍历找出空闲内存块,进行页面置换;若内存已满,在所有的内存块中随机选出一个作为被置换页面,缺页数加1。如此循环迭代,直到页面访问序列队列为空时,整个算法执行完毕。最后计算并显示缺页率。其流程图如图所示:
#ifndef PAGEREPLACEMENT_H
#define PAGEREPLACEMENT_H
#include <vector>
class PageReplacement
{
public:
PageReplacement();
~PageReplacement();
void run();
void random();
private:
void addInfo() const;
private:
int pages; // 虚拟内存的尺寸P
int firstPageFramePos; // 工作面的起始位置p
int pageFrames; // 工作面中包含的页数e
int rateM; // 工作面移动率m
std::vector<int> seqVec; // 序列号
std::vector<int> mem; // 内存块
};
#endif // PAGEREPLACEMENT_H
#include "PageReplacement.h"
#include <iostream>
#include <cstdlib>
#include <list>
PageReplacement::PageReplacement()
: mem(3, -1)
{
this->run();
}
PageReplacement::~PageReplacement()
{
}
void PageReplacement::run()
{
std::cout << "请输入虚拟内存尺寸P:";
std::cin >> pages;
std::cout << "请输入工作面的起始位置p:";
std::cin >> firstPageFramePos;
std::cout << "请输入工作面中包含的页数e:";
std::cin >> pageFrames;
std::cout << "请输入工作面移动率m:";
std::cin >> rateM;
std::cout << "请输入在0和1之间的值t:";
std::cin >> t;
for (int i = 0; i < rateM; ++i)
{
int randomNum = (rand() % pageFrames) + firstPageFramePos;
seqVec.push_back(randomNum);
}
std::cout << "序列号:";
for (int i = 0; i < seqVec.size(); ++i)
{
std::cout << seqVec.at(i) << " ";
}
std::cout << std::endl;
}
void PageReplacement::random()
{
int nLack = 0; // 缺页数
std::list<int> seqList(seqVec.begin(), seqVec.end());
int nTotal = seqList.size();
while (!seqList.empty()) // 页面访问队列不为空
{
int head = *seqList.begin(); //去队头的页面
seqList.pop_front(); //剔除掉
bool equal = false; // 标识内存中是否有与队头相等的页面
int vacant = -1; // 标识内存中是否有空闲位
for (int i = 0; i < mem.size(); ++i)
{
if (head == mem.at(i)) // 如果找到相等的页面
{
this->addInfo();
equal = true;
break;
}
else if (mem.at(i) == -1 && vacant == -1) // 找到空闲位
{
vacant = i;
}
}
if (equal) // 找到相等页面,进行下一个页面的访问
{
continue;
}
++nLack;
if (vacant != -1) // 找到空闲位
{
mem.at(vacant) = head;
this->addInfo();
continue;
}
else
{
// 随机算出一个内存块作为被置换页面
int r = rand() % (mem.size());
mem.at(r) = head;
this->addInfo(); // 显示内存情况
}
}
std::cout << "缺页率:" << (double)nLack/nTotal * 100 << "%" << std::endl;
}
void PageReplacement::addInfo() const
{
std::cout << mem.at(0) << " " << mem.at(1) << " " << mem.at(2) << std::endl;
}