#include<iostream>
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
//宏定义,生成指定范围[a,b]之间的随机数
#define Random(a,b) (rand()%(b-0+1)+0)
using namespace std;
class Page_Replace {public:double precent(double h);// 求命中率int Instuction[320];// 存储指令流的数组  double n;// 命中率 Page_Replace();//构造函数用于初始化指令流   void Show();// 显示数组初始化情况    bool Judge(int *t,int v, int n);// 判断物理空间中刚进来的指令有没有和前面的指令相同的情况,以将要进来的指令v为参数, 如果有相同的,返回false,全不相同,返回trueint Rpeat;// 该变量用于记录重复指令的下标
private:    int F_circle[4];// 随机生成的4个指令    int m;// 选取的中间位置
};double Page_Replace::precent(double h)
{n = h / 3.2;return n;
}
Page_Replace::Page_Replace()
{for (int i = 0;i < 320;i++)// 将Instruction的值先全部初始化为-1Instuction[i] = -1;int k = 0;// k当作Instruction的下标srand((unsigned int)time(0));for (int i = 0;i < 80;i++){m = Random(0, 319);F_circle[0] = m + 1;F_circle[1] = Random(0, F_circle[1]);F_circle[2] = F_circle[1] + 1;F_circle[3] = Random(F_circle[2] + 1, 319);for (int j = 0;j < 4;j++){Instuction[k] = F_circle[j];k++;}}
}
void Page_Replace::Show()
{for (int i = 0;i < 320;i++)cout << Instuction[i] << "  ";
}bool Page_Replace::Judge(int *t,int v,int n)//v为指令本身,n为每次比较的元素个数
{int i = 0;for ( i ;i < n;i++){if (t[i] == v){Rpeat = i;break;}    }if (i == n)return true;elsereturn false;
}class FIFO :public Page_Replace {// 先进先出算法的类,继承于Page_Replace
public:FIFO();double Add(int m, int n);// 进行指令流的遍历
private:// 计数器,用于计算命中了多少次double count_F;
};
FIFO::FIFO() :Page_Replace()
{count_F = 0.0;
}double FIFO::Add(int m, int n)// m的值为大小的上限,n为数组大小
{bool jud;if (n > m){cout << "超出范围!" << endl;return 0.0;}else{int *t = new int[n];// 定义一个动态数组,用于生成指定大小的数组int k = 0;//Instruction的下标int v = 0;//用于计算数组中是否已经第一次添加满while (v < n){t[v] = Instuction[k];if (Judge(t, Instuction[k + 1], v + 1) == false){count_F++;k++;}else{k++;v++;}}//对后来的指令进行判断,如果在已有的数据里,t数组不变,否则,挨个往前移for (int j = 0;j < 320 - k + 1;j++){if (Judge(t, Instuction[k], n) == false){count_F++;k++;}else{for (int i = 0;i < 9;i++){t[i] = t[i + 1];}t[9] = Instuction[k];k++;}}}cout << "FIFO算法命中的数量是:" << count_F << endl;return count_F;
}class LRU :public Page_Replace {public:LRU();int Find(int *F_demen, int left, int right);// 比较出在物理块中的所有指令中使用次数最少的指令,参数为物理块的大小double Add_L(int m,int n);
private:double count_L;
};
LRU::LRU():Page_Replace()
{count_L = 0.0;
}int LRU::Find(int *F_demen,int left,int right)// 使用快速排序法找出最小的值
{int key = F_demen[left];//将区间分为两个部分,左边的小于等于右边的int i = left, j = right;while (i < j){while (F_demen[j] >= key && i < j)//从右边开始比较j--;F_demen[i] = F_demen[j];//如果有位置不对的,将位置进行交换while (F_demen[i] <= key && i < j)i++;F_demen[j] = F_demen[i];}F_demen[i] = key;if (left < i - 1)Find(F_demen,left, i - 1);if (i + 1 < right)Find(F_demen,i + 1, right);return F_demen[0];//F_demen[0]就是最少使用的指令的下标
}
double LRU::Add_L(int m, int n)// m的值为大小的上限,n为数组大小
{bool jud;int *q = new int[n];// 定义一个动态数组,记录该进程执行的总次数for (int i = 0;i < n;i++)//将其初值都置为0{q[i] = 0;}if (n > m){cout << "超出范围!" << endl;return 0.0;}else{int *t = new int[n];// 定义一个动态数组,用于生成指定大小的数组int k = 0;//Instruction的下标int v = 0;//用于计算数组中是否已经第一次添加满while (v < n){t[v] = Instuction[k];q[v]++;// 出现一次,需要加一if (Judge(t, Instuction[k + 1], v + 1) == false)// 说明新来的指令已经存在于页面中{q[Rpeat]++;count_L++;k++;}else{k++;v++;}}// 此循环结束,数组中已有满n个指令// 对于后来的指令,需要进行判断,如果该指令已经存在于物理块中,命中for (int j = 0;j < 320 - k + 1;j++){if (Judge(t, Instuction[k], n) == false){count_L++;k++;}else{int r = Find(q, 0, 9);t[r] = Instuction[k];k++;}}cout << "LRU算法命中的数量是:" << count_L << endl;return count_L;}
}int main()
{FIFO fifo;LRU lru;fifo.Show();double k=fifo.Add(320,100);// 此方法的的原型是double Add(int m, int n);其中参数n代表分配的物理块大小,可以改变;double a = lru.Add_L(320, 100);// 同上double n=fifo.precent(k);double b = lru.precent(a);cout << "FIFO的命中率为:" << n << "%" << endl;cout << "LRU的命中率为:" << b << "%" << endl;system("pause");return 0;
}

操作系统实验--存储管理--页面置换算法--FIFO and LRU c++实现相关推荐

  1. 操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记)

    操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记) 题目要求 输入要求 输出要求 编程平台 实验成果 开始模拟 错误输入 退出程序 代码实现 抽象数据类型定义 指令地址流生成 指令地址流到页 ...

  2. 操作系统实验2—页面置换算法模拟程序设计

    一.实验目的 对页面置换做进一步的理解. 了解页面置换的任务. 通过编程掌握页面置换算法及缺页率计算. 了解Belady现象和抖动现象. 二.实验内容 输入给出一组页面访问顺序(如页面走向是1.2.5 ...

  3. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)

    页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...

  4. 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版

    页面置换算法Java版 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 帮女朋友写了份 Python版的,Python版戳这里 帮女朋友舍友写了份 C++ 版的 ...

  5. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) C++ 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 写好了 Java 版和 Python 版的- Java版这里 Python版戳这里 帮女朋友舍友写 ...

  6. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈 Java版戳 ...

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

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

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

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

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

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

最新文章

  1. XenDesktop中无法删除虚拟机
  2. python2升级_把Python2.6升级到Python2.7(适用于把Python2升级到Python3)
  3. 利用计算机提高数学课堂教学,计算机技术在数学课堂教学中的应用微探
  4. thinkphp $this-display()报错
  5. 【机器学习基础】数学推导+纯Python实现机器学习算法27:EM算法
  6. 虚拟主机创建虚拟lan_创建虚拟背景应用
  7. 【Antlr】 Antlr 错误与恢复
  8. 动态规划法(九)想要更多例子? 1
  9. Base64编码对照表
  10. Java系统架构的演化之路
  11. EasyUI:textbox自定义验证手机号(正则)
  12. 24点递归实现(c语言)
  13. STM32+ADS1110
  14. PostgreSQL的学习心得和知识总结(十九)|数据库游标详细使用说明及特性总结(全网最精细最详尽 仰望星空也要脚踏实地)
  15. [从0开始机器学习]5.逻辑回归 二分类
  16. 联想拯救者y7000p加内存条_联想 拯救者Y7000P 如何插入SD卡?
  17. 【docker入门】
  18. MATLAB 三维立体绘图
  19. vpp之浅谈插件和使用
  20. 常见文件mime类型

热门文章

  1. 误入前端三年之番外篇
  2. 名帖378 祝允明 草书《饮中八仙歌》
  3. 采购人员面临的五大挑战
  4. 解读人工智能辅助学生身心成长期
  5. 微信/支付宝安卓端和苹果端支付集合 Java版
  6. 科学计算库——Numpy基础
  7. 我的世界中国版配置java_我的世界中国版Java 不删档测试问题指引
  8. 这是一篇男女老少入门精通咸宜的正则笔记
  9. kali安装腾讯视频
  10. EOS技术贴-如何创建EOS钱包和账号并发起转账和投票