简单Clock算法
来源:互联网 发布:穆逢春 知乎 编辑:程序博客网 时间:2024/05/21 19:37
算法过程:
简单Clock算法需要根据页面内存是否被访问来决定是否置换该页面。实际编程中,与最近最久未置换算法类似,用整型数组来表示当前每个内存页面是否被访问,其中1代表被访问过,0代表未访问过。每次置换,指针循环遍历,找出第一个访问位不为1的那个内存页面。并且在找到被置换页面之前,将所经过的所有页面内存对应的访问位置0.
在内存块初始化后,取出页面访问序列队列的队头。首先判断内存块中是否已经存在该队头页面,如果存在则直接显示内存块当前情况,相应访问位置1,指针循环下移;若不存在,循环遍历内存块,找出第一个访问位不为1的那个内存页面。并且在找到被置换页面之前,将所经过的所有页面内存对应的访问位置置0. 如果找到的内存页面不为空闲位,则将缺页数加1. 如此循环迭代,直到页面访问序列队列为空时,整个算法执行完毕。最后计算并显示缺页率。其流程图如图所示:
#ifndef PAGEREPLACEMENT_H#define PAGEREPLACEMENT_H#include <vector>class PageReplacement{public:PageReplacement();~PageReplacement();void run();void clock();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::clock(){int nLack = 0;// 缺页数std::list<int> seqList(seqVec.begin(), seqVec.end());int nTotal = seqList.size();std::vector<int> timer(mem.size(), 0);int cursor = 0;// 当前的时钟指针while (!seqList.empty()){int head = *seqList.begin();// 去掉队头的页面seqList.pop_front();int p = 0;// 遍历内存块,找到与队头页面相等的内存块for(p ; p < mem.size(); ++p){if (mem.at(p) == head)// 如果找到,将其时钟访问位置1,时钟指针往下移{timer[p] = 1;cursor = p;cursor = (cursor + 1) % timer.size();this->addInfo();break;}}if (p == mem.size())// 如果没有找到{// 循环移动clock指针,知道找到访问位不为1的第一个内存块while (timer[cursor] == 1){timer[cursor] = 0;cursor = (cursor + 1) % timer.size();}++nLack;mem[cursor] = head;timer[cursor] = 1;cursor = (cursor + 1) % timer.size();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;}
0 0
- 简单Clock算法
- 【操作系统-存储器管理】简单的clock置换算法的实现
- 简单的Vector Clock
- 改进型Clock算法
- WPF做的简单Clock
- hdu 5387 Clock 简单数学
- Vector Clock算法的理解
- Vector Clock算法的理解
- Vector Clock算法的理解
- 改进型clock算法--页面置换算法
- 操作系统算法 之 改进的Clock算法
- clock
- clock
- clock
- Clock
- CLOCK
- clock
- Clock
- 最好用的SAT数学解题方法
- Android学习记录之------R文件的优化
- maven多环境打包配置
- hdoj 1113 Word Amalgamation 【判断一个字符串能否被一个字符串集里的字符串经过变换而得到】
- selenium
- 简单Clock算法
- Postman - 測試 API 的好工具
- GRE作文备考——教育的三大目的
- STL学习笔记之前篇
- 编译android源码提示/usr/bin/jar命令不存在问题的解决方法
- gcc -rdynamic参数解释
- recommenderjob原码分析
- Java - Why Enum Singleton are better in Java
- 【HTTP】HTTP状态码