实验要求

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;
}

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

  1. 用循环首次适应算法、最佳适应算法和最坏适应算法,模拟可变分区存储管理,实现对内存区的分配和回收管理

    湖南师范大学 信息科学与工程学院 操作系统课程实验报告 实验项目名称: 可变分区存储管理 题目 实验一.可变分区存储管理 一.实验目的: 加深对可变分区存储管理的理解: 提高用C语言编制大型系统程序的 ...

  2. 3.1.5 操作系统之动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

    文章目录 0.思维导图 1.首次适应算法 2.最佳适应算法 3.最坏(大)适应算法 4.临近适应算法 5.四种算法归纳比较 0.思维导图 本篇文章是对上一篇文章内存的分配与回收提到的动态分区分配算法的 ...

  3. JS实现动态分区分配中的首次适应算法和最佳适应算法

    实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解. 实验内容 (1) 用C语言(不会C这里就用JS实现)分别实现采用首次适应算法和最佳适应 ...

  4. 操作系统页面置换算法(最佳置换算法,FIFO,LRU,Clock)

    页面置换算法 为什么要页面置换 最佳置换算法 先进先出页面置换算法 LRU置换算法 Clock置换算法 为什么要页面置换 缺页中断: 在地址映射过程中,若在页表中发现所要访问的页面不在内存,则产生中断 ...

  5. 3.2.3 OS之页面置换算法(最佳置换算法、先进先出置换算法、最近最久未使用置换算法、普通时钟置换算法、改造型时钟置换算法)

    文章目录 0.思维导图 1.最佳置换算法---OPT 2.先进先出置换算法---FIFO 3.最近最久未使用置换算法---LRU 4.时钟置换算法---CLOCK 5.改造型时钟置换算法 0.思维导图 ...

  6. c模拟内存分配算法(首次适应算法,最佳适应算法,最坏适应算法)

    #include<bits/stdc++.h> using namespace std; /*定义内存的大小为100*/ #define MEMSIZE 100 /*如果小于此值,将不再分 ...

  7. 操作系统——动态分配算法(首次适应算法,最佳适应算法,最坏适应算法及回收)

    操作系统--动态分配 写的时间早了,有些许漏洞和不足,请大家不要介意 分配方式可分为四类:单一连续分配.固定分区分配.动态分区分配以及动态可重定位分区分配算法四种方式,其中动态分区分配算法就是此实验的 ...

  8. 操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】

    学习地址(哔哩哔哩网站--王道论坛):https://www.bilibili.com/video/BV1YE411D7nH?p=37 目录 1.首次适应算法(First Fit) 2.最佳适应算法( ...

  9. java 寻路算法_寻路算法-贪婪最佳优先算法

    最近开始接触寻路算法,对此不太了解的话建议读者先看这篇文章 <如何快速找到最优路线?深入理解游戏中寻路算法> . 所有寻路算法都需要一种方法以数学的方式估算某个节点是否应该被选择.大多数游 ...

  10. Java实现内存分配算法 FF(首次适应算法) BF(最佳适应算法)

    一.概述 因为这次os作业对用户在控制台的输入输出有要求,所以我花了挺多的代码来完善控制台的显示. MemoryAlgorithm类里只是和控制台输入输出有关的操作,而对内存的所有逻辑操作都是用Mem ...

最新文章

  1. HDU4549(矩阵快速幂+快速幂)
  2. Java设计模式(备忘录模式-解释器模式-状态模式-策略模式-职责链模式)
  3. c# 字符串排序 (面试题)
  4. Charles的功能操作
  5. sas univariate 结果解释_PROC UNIVARIATE过程
  6. mysql数据库各表、数据库数据容量查询
  7. android如何引用布局,android 动态布局与引用第三方layout中的布局
  8. 描述符演练-01-完善代码,使得对象添加属性的行为可以成功
  9. Djang drf:APIView源码分析
  10. VB6 中将数据导出到 Excel 提速之法
  11. 应用程序错误代码0xe06d7363怎么解决
  12. cron表达式解析生成网站
  13. Nature communications
  14. VISUAL STUDIO INSTALLER下载速度过慢的解决办法
  15. IP路由基础之静态路由
  16. 初等证明:使用无穷下降法证明丢番图方程x^4 - y^4 = z^2无非零整数解
  17. win7桌面不显示我的计算机名,win7系统桌面没有显示我的电脑图标的操作技巧
  18. 2021年中国海上风电行业发展现状分析,双碳循环下行业飞速发展「图」
  19. 后厂村码农的真实生活,颠覆你的想象
  20. iconfont阿里图标引入不生效的解决方法,三种引入方式详细步骤。

热门文章

  1. Selenium之浏览器驱动下载和配置使用
  2. 软件推荐┊最有效防止被聚生网管、P2P终结者等管理软件控制的小工具——ARP防火墙单机版...
  3. CTF web题常用解题工具
  4. 郑大第九届校赛正式赛(1819: 加加加!(油))
  5. 第一代计算机硬件逻辑主要采用,第一代计算机的硬件逻辑主要采用电子管,程序设计语言采用BASIC语言...
  6. 软件测试跟踪需求矩阵,测试管理之从需求到跟踪操作实务
  7. 进销存系统功能结构图
  8. Python3之日志模板
  9. 剪贴板是计算机系统,剪贴板在哪里,手把手教你如何打开电脑剪贴板
  10. 欧姆龙OMRON PLC程序,威纶触摸屏螺丝机 配方程序。 用ST语言编写程序+威纶触摸屏程序