虚拟内存页面置换算法(FIFO, OPT, LRU)

0x01 FIFO

  • 置换策略:置换掉先来的页面(FIFO队列首元素)
  • 优点: 简单易理解且易实现
  • 缺点: 性能不理想,会发生Belady异常(页框(帧)增加缺页率也增加)

0x02 OPT

最优页面置换算法(optimal page-replacement algorithm)

  • 置换策略:根据以后使用情况置换:
    置换掉以后不再用;如果没有不再使用的,置换掉相对最迟使用的。
  • 优点:它是最优的页面置换算法,不会发生Belady异常
  • 缺点:需要知道以后页面使用情况,实现起来困难

0x03 LRU

最近最少使用算法(Least-Recent-Used algorithm)

  • 置换策略:根据最近使用情况(上次使用时间)置换:置换掉相对当前时刻最长时间没有使用的页面
    (相对而言,最近刚用的不置换)
  • 优点:近似最优,没有Belady异常
  • 缺点:可能需要重要的硬件辅助,实现上比较困难

代码

以下根据个人思路所写,仅供参考

#include <iostream>
#include <cstring>
#include <algorithm>
#include <queue>
using namespace std;const int MAX_SIZE = 1e3+5;
const  int INF = 0x3f3f3f3f;
int pg_last[MAX_SIZE]; //last time of using page
bool vis[MAX_SIZE]; //marked in queueclass Node
{public:int node[MAX_SIZE];int iSize;int cur;bool isFull();bool exist(int x);Node(){cur = 0;}Node(int sz){iSize = sz;cur = 0;}
};// struct Pair 辅助OPT
struct Pair
{int pos;int id;bool operator<(const Pair x)const{return id > x.id;}
} op[MAX_SIZE];bool Node::isFull()
{return cur == iSize;
}void createPages(int n,Node &pg)
{cout<<"请输入长度为"<<n<<"的页面访问序列:";pg.iSize = n;for(int i = 0; i < n; ++i){cin>>pg.node[i];}
}void printResult(int n,int fail_cnt,int replace_cnt)
{double fail_rate = fail_cnt / double(n) * 100;cout<<" fail times: "<<fail_cnt<<" fail_rate: "<<fail_rate<<"%"<<endl;cout<<" replace times: "<<replace_cnt<<endl;cout<<"--------------------------------------"<<endl;
}bool Node::exist(int x)
{for(int i = 0; i < cur; ++i){if(x == node[i]){return true;}}return false;
}void FIFO(int m,Node pg)
{Node st(m); // storageint fail_cnt = 0;int replace_cnt = 0;queue<int>q;memset(vis,false,sizeof(vis));for(int i = 0; i < pg.iSize; ++i){if(vis[pg.node[i]]) continue;if(int(q.size()) < m){q.push(pg.node[i]);vis[pg.node[i]] = true;fail_cnt++;}else{int aim = q.front();q.pop();vis[aim] = false;q.push(pg.node[i]);vis[pg.node[i]] = true;fail_cnt++;replace_cnt++;}}cout<<"-------------FIFO Result--------------"<<endl;printResult(pg.iSize,fail_cnt,replace_cnt);
}int findRepOPT(int s,Node st,Node pg)
{int k = 0;bool flag; // 标记以后是否会使用for(int i = 0; i < st.iSize; ++i){flag = false;for(int j = s; j < pg.iSize; ++j){if(st.node[i] == pg.node[j]){flag = true;op[k].id = j;op[k++].pos = i;break;}}if(!flag){return i;}}sort(op,op+k);return op[0].pos;
}void OPT(int m,Node pg)
{Node st(m); // storageint fail_cnt = 0;int replace_cnt = 0;for(int i = 0; i < pg.iSize; ++i){if(st.exist(pg.node[i])) continue;if(!st.isFull()){st.node[st.cur++] = pg.node[i];fail_cnt++;}else{int pos = findRepOPT(i,st,pg);st.node[pos] = pg.node[i];fail_cnt++;replace_cnt++;}}cout<<"-------------OPT Result--------------"<<endl;printResult(pg.iSize,fail_cnt,replace_cnt);
}int findRepLRU(Node st)
{int minx = INF,pos = 0;for(int i = 0; i < st.iSize; ++i){if(pg_last[st.node[i]] < minx){minx = pg_last[st.node[i]];pos = i;}}return pos;
}void LRU(int m,Node pg)
{Node st(m); // storageint fail_cnt = 0;int replace_cnt = 0;for(int i = 0; i < pg.iSize; ++i){pg_last[pg.node[i]] = i;if(st.exist(pg.node[i])) continue;if(!st.isFull()){st.node[st.cur++] = pg.node[i];fail_cnt++;}else{int pos = findRepLRU(st);st.node[pos] = pg.node[i];fail_cnt++;replace_cnt++;}}cout<<"-------------LRU Result--------------"<<endl;printResult(pg.iSize,fail_cnt,replace_cnt);}int main()
{/*3 122 3 2 1 5 2 4 5 3 2 5 2*//*3 207 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1*/int m,n;cout<<"请输入分配给进程的页框数 和 进程页面数:";cin>>m>>n;Node pg;createPages(n,pg);cout<<"-------------选择页面置换算法---------------"<<endl;cout<<"-------------1.FIFO---------------"<<endl;cout<<"-------------2.OPT---------------"<<endl;cout<<"-------------3.LRU---------------"<<endl;cout<<"-------------0.退出---------------"<<endl;int op;while(cin>>op){switch(op){case 1:FIFO(m,pg);break;case 2:OPT(m,pg);break;case 3:LRU(m,pg);break;case 0:exit(0);}}return 0;
}

运行实例

 3 122 3 2 1 5 2 4 5 3 2 5 2

3 207 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1

C++实现虚拟内存页面置换算法(FIFO, OPT, LRU)相关推荐

  1. Cache与页面置换算法FIFO、LRU等

    1 Cache与存储结构 (1) 定义 狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用动态随机存取存储器(Dynamic Random Access Memory, ...

  2. 操作系统 页面置换算法FIFO与LRU的实现

    FIFO FIFO算法是最早出现的置换算法.该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰. LRU 最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做 ...

  3. 页面置换算法 FIFO和LRU 及各自的命中率

    (1) 先进先出算法FIFO:该算法的实质是选择作业中在主存驻留时间最长的一页淘汰,这种算法容易实现,例如分配一个作业的存储块数为m,则只需建立一张m个元素的队列表Q(0).Q(1).-.Q(m-1) ...

  4. 操作系统实验--存储管理--页面置换算法--FIFO and LRU c++实现

    #include<iostream> #include <stdio.h> #include <stdlib.h> #include <time.h> ...

  5. 操作系统课设之虚拟内存页面置换算法的模拟与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  6. OPT和LRU页面置换算法C语言代码,页面置换算法模拟——OPT、FIFO和LRU算法.doc

    实用标准文案 精彩文档 操作系统实验报告 页面置换算法模拟 --OFT.FIFO和LRU算法 班级:2013级软件工程1班 学号:X X X 姓名:萧氏一郎 数据结构说明: Memery[10]物理块 ...

  7. 操作系统实验--页面置换算法(OPT/FIFO/LRU/LFU)cpp

    前言 学习笔记 void IntoPage(int m);//将第m条指令转化为对应的页数 int isInside(int number,int Msize);//判断页号是否在内存中 void O ...

  8. 页面置换算法 - FIFO、LFU、LRU

    缓存算法(页面置换算法)-FIFO. LFU. LRU 在前一篇文章中通过leetcode的一道题目了解了LRU算法的具体设计思路,下面继续来探讨一下另外两种常见的Cache算法:FIFO. LFU ...

  9. 7-1 页面置换算法--FIFO (50 分)(思路详解)

    一:题目 先初始化页面大小,和物理块数.连续输入页面的逻辑地址,以"-1"作为结束标志,采用FIFO页面置换算法.固定分配局部置换分配策略.输出该页面的页号和页内位移,若该页不在内 ...

最新文章

  1. mysql skip network_MYSQL-skip-networking
  2. Sizzle引擎--原理与实践(二)
  3. 护士计算机等级考试报名时间2015,湖南大学2015年9月全国计算机等级考试报名时间...
  4. QT的QLatin1String类的使用
  5. Cubieboard:享誉国外 Linux 圈子的中国产品
  6. FAILED: ValidationFailureSemanticException partition spec {dt=2021-04-01} doesn‘t contain all (2) pa
  7. 如何使用Visual Studio Code调试PHP CLI应用和Web应用
  8. Qt笔记-递归获取文件夹中文件(含过滤文件名)
  9. 面试必考题:基本95%的面试都会被问到的?
  10. 【斐波那切数列】LeetCode 70. Climbing Stairs
  11. python 定时任务 全局变量_APScheduler-Python定时任务
  12. 正好股票资讯大盘平衡被打破
  13. PFC的使用与探索(一)
  14. PPT:灯塔工厂相关介绍
  15. javaSE探赜索隐之一<小生的第一篇CSDN博客,欢迎大家指正>
  16. 如何写好一份产品分析报告
  17. MacBook+eGPU编译安装pytorch、tensorflow(OSX10.13.3,python3.6,cuda9.1,cudnn7)(未完成)
  18. U盘装系统(Linux)
  19. Springboot文件删除(图片删除)
  20. 攻防世界进阶upload

热门文章

  1. delphi if多个条件_屡试不爽!使用策略模式代替多个if条件语句
  2. input onclick点击button无反应_热图分析:精确洞察用户点击偏好
  3. Git 删除远程仓库文件
  4. 国庆期间,我造了台计算机
  5. 源码分享,仿英雄联盟对战游戏!
  6. 自动驾驶「无视」障碍物:百度研究人员攻陷激光雷达
  7. 我的研究生这三年(含腾讯AI Lab实习、CVPR发表经验)
  8. 贪吃蛇程序设计报告python_20192116 2019-2020-2 《Python程序设计》实验四报告
  9. python表单填写_Python3.4 splinter(模拟填写表单)使用方法
  10. 如何配置html prettify,[HTML] Prettify 代码高亮使用总结