三种页面置换算法的C++模拟
#include<iostream>
using namespace std;
int page[] = { ,,,,,,,,,,,,,,,,,,,,- };
void FIFO();
void OPT();
void RLU();
bool inArray(int* a, int n, int p);
int main(void) {
FIFO();
OPT();
RLU();
system("pause");
}
void FIFO() {
int temp[] = { -,-,- };
int time[] = { ,, };
int num = ;
int error = ;
cout << "FIFO:" << endl;
while (page[num] != -) {
if (inArray(temp, , page[num])) {
std::cout << page[num] << ',';
std::cout << endl;
}
else {
error++;
bool hasChanged = false;
for (int i = ; i < ; i++) {
if (time[i] == && hasChanged == false) {
time[i] = ;
temp[i] = page[num];
hasChanged = true;
}
if (time[i] != ) {
time[i]--;
}
}
std::cout << page[num] << ',' << ' ';
for (size_t i = ; i < ; i++) {
if (temp[i] == -) {
std::cout << '*' << ' ';
}
else {
std::cout << temp[i] << ' ';
}
}
std::cout << endl;
}
num++;
}
cout << "错误率:" << error << endl;
}
bool inArray(int* a, int n, int p) {
for (int i = ; i < n; i++) {
if (p == a[i]) {
return true;
}
}
return false;
}
void OPT() {
int temp[] = { -,-,- };
int num = ;
int error = ;
//OPT已知未来的页数为20
cout << "OPT:" << endl;
while (page[num] != -) {
int a = page[num];
if (inArray(temp, , page[num])) {
std::cout << page[num] << ',';
std::cout << endl;
}
else {
error++;
bool fuck = false;
for (size_t i = ; i < ; i++){
if (temp[i] == -) {
temp[i] = page[num];
fuck = true;
break;
}
} if (fuck == false) {
int distance[] = { ,, };
for (int i = ; i >= num; i--) {
for (int j = ; j < ; j++) {
if (temp[j] == page[i] && (i - num) < distance[j]) {
distance[j] = i - num;
}
}
}
int k = ;
int max = -;
for (size_t i = ; i < ; i++) {
if (max < distance[i]) {
max = distance[i];
k = i;
}
}
temp[k] = page[num];
}
std::cout << page[num] << ',' << ' ';
for (size_t i = ; i < ; i++) {
if (temp[i] == -) {
std::cout << '*' << ' ';
}
else {
std::cout << temp[i] << ' ';
}
}
std::cout << endl;
}
num++;
}
cout << "错误率:" << error << endl;
}
void RLU(){
int temp[] = { -,-,- };
int time[] = { -,-,- };
int num = ;
int error = ;
cout << "RLU:" << endl;
while (page[num] != -) {
int a = page[num];
if (inArray(temp, , page[num])) {
std::cout << page[num] << ',';
std::cout << endl;
//bool Changed = false;
for (int i = ; i < ; i++) {
if (temp[i] == page[num]) {
time[i] = ;
//Changed = true;
}
if (temp[i] != page[num]&&time[i]!=) {
time[i]--;
}
}
}
else {
error++;
//bool hasChange = false;
for (size_t i = ; i < ; i++){
if (temp[i] == -) {
temp[i] = page[num];
time[i] = ;
break;
}
if(time[i] == ) {
temp[i] = page[num];
time[i] = ;
}
else {
time[i]--;
}
}
std::cout << page[num] << ',' << ' ';
for (size_t i = ; i < ; i++) {
if (temp[i] == -) {
std::cout << '*' << ' ';
}
else {
std::cout << temp[i] << ' ';
}
}
std::cout << endl;
}
num++;
}
cout << "错误率:" << error << endl;
}
三种页面置换算法的C++模拟的更多相关文章
- OS_页面置换算法:C++实现
一.实验目的: 通过模拟实现请求页式存储管理的几种基本页面置换算法,了解虚拟存储技术的特点,掌握虚拟存储请求页式存储管理中几种页面置换算法的基本思想和实现过程,并比较它们的效率. 二.实验内容: 本实 ...
- 页面置换算法——最近最久未使用算法(c语言实现)
操作系统实验:用C语言编程实现最近最久未使用置换算法(LRU) 最近最久未使用置换算法(LRU),全称Least Recently Used,是一种页面置换算法. 对于在内存中但又不用的数据块(内存块 ...
- (待续)C#语言中的动态数组(ArrayList)模拟常用页面置换算法(FIFO、LRU、Optimal)
目录 00 简介 01 算法概述 02 公用方法与变量解释 03 先进先出置换算法(FIFO) 04 最近最久未使用(LRU)算法 05 最佳置换算法(OPT) 00 简介 页面置换算法主要是记录内存 ...
- 虚存管理页面置换算法 — FIFO和RUL算法模拟实现
本篇博文为追忆以前写过的算法系列第一篇(20081021) 温故知新 目的: 为了解决内存容量有限与多作业执行的冲突.运用了虚拟存储技术.能从逻辑上对内存进行扩充,达到扩充内存的效果.分页存储管理是实 ...
- 操作系统笔记(六)页面置换算法 FIFO法 LRU最近最久未使用法 CLOCK法 二次机会法
前篇在此: 操作系统笔记(五) 虚拟内存,覆盖和交换技术 操作系统 笔记(三)计算机体系结构,地址空间.连续内存分配(四)非连续内存分配:分段,分页 内容不多,就不做index了. 功能:当缺页中断发 ...
- 页面置换算法之Clock算法
1.前言 缓冲池是数据库最终的概念,数据库可以将一部分数据页放在内存中形成缓冲池,当需要一个数据页时,首先检查内存中的缓冲池是否有这个页面,如果有则直接命中返回,没有则从磁盘中读取这一页,然后缓存到内 ...
- 操作系统页面置换算法(opt,lru,fifo,clock)实现
选择调出页面的算法就称为页面置换算法.好的页面置换算法应有较低的页面更换频率,也就是说,应将以后不会再访问或者以后较长时间内不会再访问的页面先调出. 常见的置换算法有以下四种(以下来自操作系统课本). ...
- 操作系统-1-存储管理之LFU页面置换算法(leetcode460)
LFU缓存 题目:请你为 最不经常使用(LFU)缓存算法设计并实现数据结构.它应该支持以下操作:get 和 put. get(key) - 如果键存在于缓存中,则获取键的值(总是正数),否则返回 -1 ...
- 操作系统-2-存储管理之LRU页面置换算法(LeetCode146)
LRU缓存机制 题目:运用你所掌握的数据结构,设计和实现一个 LRU (最近最少使用) 缓存机制. 它应该支持以下操作: 获取数据 get 和 写入数据 put . 获取数据 get(key) - ...
随机推荐
- P2669 金币
题目描述 国王将金币作为工资,发放给忠诚的骑士.第一天,骑士收到一枚金币:之后两天(第二天和第三天),每天收到两枚金币:之后三天(第四.五.六天),每天收到三枚金币:之后四天(第七.八.九.十天),每 ...
- Android PhotoView基本功能实现
Android开发过程中,想必都使用过PhotoView来实现图片展示的功能.在最新版的sdk(android-23)有了一个原生的photoView,并且代码实现也很简单,逻辑也很清晰.我们在实际的 ...
- MySQL详解
MySQL详解 什么是数据库 # 用来存储数据的仓库 # 数据库可以在硬盘及内存中存储数据 # 数据库与文件存储数据区别 # 数据库本质也是通过文件来存储数据, 数据库的概念就是系统的管理存储数据的文 ...
- 相关性不一定等于因果性:从 Yule-Simpson’s Paradox 讲起
1. 两件事伴随发生,不代表他们之间有因果关系 - 从一些荒诞相关性案例说起 在日常生活和数据分析中,我们可以得到大量相关性的结论,例如: 输入X变量,有98%置信度得到Y变量 只要努力,就能成功 只 ...
- PHP的array_walk和array_map函数实现数组值UTF-8转GBK编码
在PHP中,array_walk() 和 array_map()两个函数都可以实现对数组中每个值的修改,比如本例就是将数组中所有的值,由UTF-8编码转成GBK编码. 当然,除了这两个函数,也可以用 ...
- 洛谷上的C语言三连击。
注意看题目,没有0,一直错. #include<stdio.h> int panduan1(int num1,int num2, int num3); int main(){ int i, ...
- Prometheus笔记(二)监控go项目实时给grafana展示
欢迎加入go语言学习交流群 636728449 Prometheus笔记(二)监控go项目实时给grafana展示 Prometheus笔记(一)metric type 文章目录 一.promethe ...
- Java修炼——内部类详解
内部类详解 定义:将一个类定义在另一个类的内部,该类就称为内部类 类中定义的内部类特点: 内部类作为外部类的成员,可以直接访问外部类的成员 (包括 private 成员),反之则不行. 内部类做为外部 ...
- 学习go第一天-编写第一个go程序
开发环境构建 GOPATH 在1.8版本前必须设置这个环境变量 1.8以及更高版本如果没有设置,则使用默认值在Mac上GOPATH可以通过修改 -/.bash_profile来设置 程序基本结构 pa ...
- zuul+security跨域Cors问题解决
zuul+security跨域Cors问题解决 简介 场景 在服务后台都会出现跨域cors问题,不过一般spring解决起来比较方便,在框架+框架的基础上,问题就显得特别明显了,各种冲突,不了解源码的 ...