LRU最近最久未使用算法

来源:互联网 发布:遗传算法讲解 编辑:程序博客网 时间:2024/06/05 07:54

算法过程

最近最久未使用算法需要引入内存块时钟,即为每个内存块设定一个计时器,用于记录相应内存块中的页面已经存在的时间。每次置换选出所有内存块时钟中最大者作为被置换页面,当页面发生置换时,将其对应的计时器清零,并且其他计时器加1.可用等长的整型数组来表示每个内存块的计时器。

在内存块初始化后,取出页面访问序列队列的队头。首先判断内存块中是否已经存在该队头页面,如果存在则直接显示内存块当前情况;否则,判断此时内存是否已满。如果内存未满,循环遍历找出空闲内存块,进行页面置换;若内存已满,选出所有内存块时钟中最大者,并置换之,缺页数加1. 每发生一次置换,被置换页面内存所对应的计时器清零,其他计时器加1. 如此循环迭代,直到页面访问序列队列为空时,整个算法执行完毕。最后计算并显示缺页率。其流程图如图所示:




代码示例:

#ifndef PAGEREPLACEMENT_H#define PAGEREPLACEMENT_H#include <vector>class PageReplacement{public:PageReplacement();~PageReplacement();void run();void LRU();private:void addInfo() const;private:int pages;// 虚拟内存的尺寸Pint firstPageFramePos;// 工作面的起始位置pint pageFrames;// 工作面中包含的页数eint rateM;// 工作面移动率mstd::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::LRU(){int nLack = 0;// 缺页数std::list<int> seqList(seqVec.begin(), seqVec.end());int nTotal = seqList.size();std::vector<int> timer(mem.size(), 0);// 每个内存块对应的时钟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 (mem.at(i) == head)// 如果找到相等的页面{equal = true;this->addInfo();// 显示内存块timer.at(i) = -1;// 相等的时钟清零,其他的时钟加1for (int j = 0; j < timer.size(); ++j){++timer[j];}break;}else if (mem.at(i) == -1 && vacant == -1)// 如果找到空闲位{vacant = i;}}if (equal)// 如果找到相等的页面,则进行下一个查找{continue;}++nLack;if (vacant !=  -1){mem[vacant] = head;// 把队头的放入到空闲位中this->addInfo();timer[vacant] = -1;// 空闲位时钟清零,其他时钟加1for (int j = 0; j < timer.size(); ++j){++timer[j];}continue;}else{int max = timer[0];int subIndex = 0;for (int p = 0; p < timer.size(); ++p){if (timer.at(p) > max){max = timer.at(p);// 找到最近最久没有被使用的内存块subIndex = p;}}mem[subIndex] = head;// 把队头的放入到最近最久未被使用的内存块中this->addInfo();timer[subIndex] = -1;for (int j = 0; j < timer.size(); ++j){++timer[j];}}}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;}


#include <iostream>#include "PageReplacement.h"int main(){PageReplacement pageReplacement;pageReplacement.LRU();return 0;}






0 0
原创粉丝点击