操作系统实验--存储管理--页面置换算法--FIFO and LRU c++实现
#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++实现相关推荐
- 操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记)
操作系统实验:页面置换算法的模拟实现及命中率对比(学习笔记) 题目要求 输入要求 输出要求 编程平台 实验成果 开始模拟 错误输入 退出程序 代码实现 抽象数据类型定义 指令地址流生成 指令地址流到页 ...
- 操作系统实验2—页面置换算法模拟程序设计
一.实验目的 对页面置换做进一步的理解. 了解页面置换的任务. 通过编程掌握页面置换算法及缺页率计算. 了解Belady现象和抖动现象. 二.实验内容 输入给出一组页面访问顺序(如页面走向是1.2.5 ...
- 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)
页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...
- 【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版
页面置换算法Java版 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 帮女朋友写了份 Python版的,Python版戳这里 帮女朋友舍友写了份 C++ 版的 ...
- 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) C++ 版
页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 写好了 Java 版和 Python 版的- Java版这里 Python版戳这里 帮女朋友舍友写 ...
- 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版
页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈 Java版戳 ...
- 操作系统 页面置换算法FIFO与LRU的实现
FIFO FIFO算法是最早出现的置换算法.该算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面予以淘汰. LRU 最近最久未使用(LRU)的页面置换算法是根据页面调入内存后的使用情况做 ...
- Cache与页面置换算法FIFO、LRU等
1 Cache与存储结构 (1) 定义 狭义的Cache指的是位于CPU和主存间的快速RAM, 通常它不像系统主存那样使用动态随机存取存储器(Dynamic Random Access Memory, ...
- 页面置换算法 FIFO和LRU 及各自的命中率
(1) 先进先出算法FIFO:该算法的实质是选择作业中在主存驻留时间最长的一页淘汰,这种算法容易实现,例如分配一个作业的存储块数为m,则只需建立一张m个元素的队列表Q(0).Q(1).-.Q(m-1) ...
最新文章
- XenDesktop中无法删除虚拟机
- python2升级_把Python2.6升级到Python2.7(适用于把Python2升级到Python3)
- 利用计算机提高数学课堂教学,计算机技术在数学课堂教学中的应用微探
- thinkphp $this-display()报错
- 【机器学习基础】数学推导+纯Python实现机器学习算法27:EM算法
- 虚拟主机创建虚拟lan_创建虚拟背景应用
- 【Antlr】 Antlr 错误与恢复
- 动态规划法(九)想要更多例子? 1
- Base64编码对照表
- Java系统架构的演化之路
- EasyUI:textbox自定义验证手机号(正则)
- 24点递归实现(c语言)
- STM32+ADS1110
- PostgreSQL的学习心得和知识总结(十九)|数据库游标详细使用说明及特性总结(全网最精细最详尽 仰望星空也要脚踏实地)
- [从0开始机器学习]5.逻辑回归 二分类
- 联想拯救者y7000p加内存条_联想 拯救者Y7000P 如何插入SD卡?
- 【docker入门】
- MATLAB 三维立体绘图
- vpp之浅谈插件和使用
- 常见文件mime类型