页面置换算法之最佳置换算法的模拟(C++)

news/2024/11/29 8:54:49/

实验要求

1)设计模拟实现OPT、FIFO和LRU页面置换算法中的任意一种。

OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换。

FIFO算法:算法总是选择在队列中等待时间最长的页面进行置换。

LRU算法:如果某一个页面被访问了,它很可能还要被访问;相反,如果它长时间不被访问,那么,在最近未来是不大可能被访问的。

2)完成算法代码。

3)运行程序,算出结果。

设计思路

  模拟一个拥有若干个虚页的进程在给定的若干个实页中运行、并在缺页中断发生时使用OPT算法进行页面置换的情形。其中内存页面大小可手动输入进行设置,虚页的个数可以事先给定(例如10个),对这些虚页访问的页地址流(其长度可以事先给定,例如20次虚页访问)可以由程序随机产生,也可以手动输入。要求程序运行时屏幕能显示出置换过程中的状态信息并输出访问结束时的页面命中率。

实验结果与分析:

 最佳置换算法:一个进程在内存的若干个页面中,哪一个页面是未来最长时间内不再被访问的,那么如果发生缺页中断时,就将该页面换出,以便存放后面调入内存中的页面。
程序进入时可通过程序设定物理块大小
接着输入虚页长度,即程序运行时页面号引用串长度

程序有两种页地址流产生方式,分别为系统随机产生和手动输入

最后输出总的命中次数和命中率

 

 

源程序
 

#include<iostream>
#include<cstring>using namespace std;const int N = 1e3 + 10;
int h[N], data[N], temp[N];//分配的物理块  虚页流 存储该页面未来要被访问的时间 
int n, m;//物理块大小  虚页的长度
double sum;//总命中次数 void init()
{cout << "最佳置换算法OPT 请输入物理块大小" << endl;cin >> n;cout << "请输入虚页长度" << endl;cin >> m; cout << "请选择页地址流产生方式\n1.系统随机生成,2.手动输入" << endl;int op;cin >> op;if(op == 1)//随机生成 {for(int i = 1; i <= m; i ++) {data[i] = ( rand() % (9 - 1 + 1 ) ) + 1;//产生[1,9]的随机数 cout << data[i] << ' ';	}cout << endl;}  	else if(op == 2)//手动输入 {for(int i = 1; i <= m; i ++) cin >> data[i];}cout << "当前到达页号  ";for(int i = 1; i <= n; i ++)cout << "物理块 " << i << "  ";cout << "       是否产生缺页" << endl; 
} void show(int k, bool flag)//当前虚页块位号 是否产生缺页 
{cout << data[k] << "           ";for(int i = 1; i <= n; i ++){if(h[i] == 0) cout << "空           ";else cout << h[i] << "           ";	} if(flag) cout << "未产生缺页";else cout << "产生缺页"; cout << "\n----------------------------------------------------------------" << endl;
}int main()
{init();//初始化for(int i = 1; i <= m; i ++)//对虚页流进行处理 {bool flag = false;//当前内存中是否有该页面 int j = data[i];//该页面下标for(int k = 1; k <= n; k ++)//遍历物理块if(h[k] == j)//当前内存中有该页面 {flag = true;//cout << "here" << endl;sum ++;//命中次数加1 break;	} bool temp_flag = flag;//保存标志位if(!flag)//当前内存中无该页面,需调用页面置换算法(先检查有无空白物理块){for(int k = 1; k <= n; k ++)if(h[k] == 0)//当前有空白物理块,将该页面置于此处 {h[k] = j;//cout << "here" << endl;flag = true;//此时flag代表该页面放入内存没 break;}}if(!flag)//无空白物理块, 采用OPT算法 {memset(temp, 0x3f, sizeof temp);//temp用来存放下一次被访问的位置,默认为0x3f代表未来不被访问for(int q = 1; q <= n; q ++)//遍历物理块 for(int k = i + 1; k <= m; k ++)//遍历后续页面流if(data[k] == j)//找到下一次被访问的位置 {temp[q] = k; break;	} int max = temp[1], t = 1;//最大访问位置,及其下标 for(int k = 2; k <= n; k ++)//遍历物理块,找到最晚被访问的页面if(temp[k] > max){t = k;max = temp[k];} h[t] = j;//将该页面置换进入 }show(i, temp_flag);//打印输出数据 		}cout << "命中次数为 " << sum << " 虚页流长度 " << m << " 命中率为 " << sum / m;return 0;
}


http://www.ppmy.cn/news/660597.html

相关文章

最佳置换算法

最佳置换算法&#xff08;OPT&#xff09;&#xff1a;从主存中移出永远不再需要的页面&#xff1b;如无这样的页面存在&#xff0c;则选择最长时间不需要访问的页面。于所选择的被淘汰页面将是以后永不使用的&#xff0c;或者是在最长时间内不再被访问的页面&#xff0c;这样可…

置换的轮换表示

置换的轮换表示 问题描述知识回顾置换的轮换表示不相杂轮换 题目解读编程实现 问题描述 给出一个置换&#xff0c;写出该置换的轮换表示。比如 表示为(1 3 6 7 8 4 2)(5 9) 输入&#xff1a;置换后的序列 输出&#xff1a;不相杂的轮换乘积&#xff0c;每行表示一个轮换&…

【置换矩阵】

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 [TOC](文章目录) 参考https://blog.csdn.net/jhshanvip/article/details/105388563 前言一、置换矩阵是什么&#xff1f;二、特点1.矩阵左乘置换矩阵交换行2.矩阵右…

24 置换基本概念

目录 一 互换与轮换 二 置换交换律与结合律 三 置换的化简方法 四 轮换的乘方计算方法 五 轮换的其他规律 六 置换凯来图 七 置换代数运算 一 互换与轮换 要了解群论&#xff0c;置换必不可少。而且置换在生活、工作中也非常常见。虽然说置换&#xff0c;有点小儿科&…

置换

置换 定义 集合 X 的置换是 X 到其自身的双射。 n个元素的集合X恰有 n! 个置换。 置换也可看成集合 X 中元素的重排。 比如 {1, 2, 3} 的重排有&#xff1a; 123&#xff1b;132&#xff1b;213&#xff1b;231&#xff1b;312&#xff1b;321 X的一次重排i_1&#xff0c;i_2&a…

固定分配,可变分配,局部置换,全局置换

准备或运行时&#xff0c; 固定分配&#xff1a; 给进程的 每个物理块 分配数量固定&#xff0c; 运行时数量固定&#xff0c;按照分配数量。 可变分配&#xff1a; 分配数量固定&#xff0c; 运行时数量不固定。 缺页时&#xff0c; 局部置换&#xff1a; 缺页进程独立&am…

置换矩阵

置换矩阵 题解 首先对于有大于1个环的情况&#xff0c;明显行列式值是为零的。 因为这种情况必定有一个环的长度小于 ∣ n 2 ∣ \left|\frac{n}{2}\right| ∣∣​2n​∣∣​&#xff0c;所以就一定可以将一个环的区域全部消成0&#xff0c;这样答案就肯定为0了。 那么对于 p …

置换贴图(Displacement map),凹凸贴图(Bump map)与法线贴图(Normal map)的区别

英文原文地址《Difference between Displacement , Bump and Normap Maps》 By Pluralsight on August 14, 2014 你是否在学习如何为你的3D素材制作贴图的时候遇到了点小挫折&#xff1f;不要灰心&#xff01;很多贴图或3D领域的艺术家在初次遇到凹凸贴图(Bump map)&#xff0c…