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

  • 题目要求
    • 输入要求
    • 输出要求
  • 编程平台
  • 实验成果
    • 开始模拟
    • 错误输入
    • 退出程序
  • 代码实现
    • 抽象数据类型定义
    • 指令地址流生成
    • 指令地址流到页地址流的转换
    • OPT算法命中率计算
    • FIFO算法命中率计算
    • LRU算法命中率计算
    • FIFO与LRU的命中率大小对比
    • bat文件制作

题目要求

使用Java进行编程,程序可以多次计算在400条页地址访问情况下,内存容量从4页框增至40页框的过程中使用OPT(最佳置换)、FIFO(先进先出)和 LRU(最近最少使用)算法的命中率(即1-缺页率),并统计了FIFO与LRU这两种算法命中率大小的对比结果,方便用户在多次比较中总结FIFO与LRU算法的平均性能。
程序最终以双击bat文件的形式来运行。

输入要求

本程序有效输入的形式为正整数,输入值为1或0。
输入1则开始模拟页面置换算法,输入0则退出程序,其他输入均会让程序提示错误信息。

输出要求

本程序输出的形式为简体中文、正整数、浮点数以及界面修饰符号。简体中文和正整数用于说明程序信息和输出内容;浮点数是保留小数点4位的double型数据,用于展示三种页面置换算法的命中率;界面修饰符号让结果展示得更加清晰易懂。
输入1之后,程序首先以每行10个展示随机生成的400条指令地址,范围为[0,399];接着展示由这400条指令地址转换成的400条页地址,范围为[0,39];最后展示页框数从4到40的情况下OPT、FIFO、LRU这三种页面置换算法的命中率,以及FIFO与LRU算法的命中率大小对比结果。

编程平台

Eclipse 4.8.0 控制台

实验成果

开始模拟



错误输入

退出程序

代码实现

思路:编写三个Java包,分别为main、calculation和produceData。main存放程序主类Main.java,produceData存放用于产生指令地址流的RandomNumber.java和用于将指令地址流变换成页地址流的ConvertToPageNumber.java,calculation存放用于页面置换算法命中率的OutputResult.java。
(1)首先,Main函数调用RandomNumber.produce()产生随机的指令地址流,并调用RandomNumber.output()展示指令地址流。
(2)其次,Main函数调用ConvertToPageNumber.convert(addresses)将指令地址流变换成页地址流,并调用ConvertToPageNumber.output()展示页地址流。
(3)最后,Main函数在不同用户内存容量下分别调用OutputResult.calculteOPT(addresses, pageFrame)、OutputResult.calculteFIFO(addresses, pageFrame)、OutputResult.calculteLRU(addresses, pageFrame)计算三种页面置换算法的命中率,并调用OutputResult.output()输出命中率情况以及FIFO与LRU的命中率比较结果。

抽象数据类型定义

// 在Main.java中记录生成的指令地址流和页地址流,并作为所调用函数的参数。
int[] addresses = new int[400];// 在RandomNumber.java中记录最终结果,并作为函数返回值。
static int[] instructionAddresses = new int[400];// 在ConvertToPageNumber.java中记录最终结果,并作为函数返回值。
static int[] pageAddresses = new int[400];// 在OutputResult.java中记录最终结果。
// accuracy[0]、accuracy[1]、accuracy[2]分别存储不同页框数下三种页面置换算法的命中率。
// accuracy[3]存储FIFO与LRU算法的命中率大小对比结果。
static double[][] accuracy = new double[4][37];// 在OutputResult.java中记录当前用户内存容量中页地址的信息。
// pageCapacity[pageFrame][0]记录当前页框的页地址;
// pageCapacity[pageFrame][1]则根据OPT、FIFO和LRU算法的需要分别记录当前页框下页地址未来是否被访问、滞留在该页框的时长、最新被访问时间值的信息。
static int[][] pageCapacity = new int[pageFrame][2];

指令地址流生成

// 存储指令地址
static int[] instructionAddresses;// 随机生成400条指令地址
public static int[] produce() {// 存储随机生成的400条指令地址instructionAddresses = new int[400];// 分区间采用非顺序与顺序方法轮流产生随机指令地址int k = 0;// 各区间增幅while(k < 200) {// [0,199]生成随机指令地址instructionAddresses[0 + k] = (int) (Math.random() * 200);if(instructionAddresses[0 + k] != 199) { // 保证顺序执行后不跨区间instructionAddresses[0 + k + 1] = instructionAddresses[0 + k] + 1;}else {instructionAddresses[0 + k + 1] = instructionAddresses[0 + k];}// [200,399]生成随机指令地址instructionAddresses[200 + k] = (int) (Math.random() * 200) + 200;if(instructionAddresses[200 + k] != 399) { // 保证顺序执行后不跨区间instructionAddresses[200 + k + 1] = instructionAddresses[200 + k] + 1;}else {instructionAddresses[200 + k + 1] = instructionAddresses[200 + k];}k += 2;}return instructionAddresses;
}

指令地址流到页地址流的转换

// 存储变换生成的页地址(页号)
static int[] pageAddresses;// 变换生成400条页地址(页号)
public static int[] convert(int[] instructionAddresses) {// 存储变换生成的400条页地址(页号)pageAddresses = new int[400];for(int i = 0; i < 400; i ++) {if(instructionAddresses[i] < 0 || instructionAddresses[i] >399) {System.out.println();System.out.println("指令数据中存在错误数据!");System.out.println();}else {pageAddresses[i] = instructionAddresses[i] / 10;}}return pageAddresses;
}

OPT算法命中率计算

// 存储页框里的页地址信息
static int[][] pageCapacity;public static void calculteOPT(int[] pageAddresses, int pageFrame) {// pageCapacity[pageFrame][0]放置页地址;// pageCapacity[pageFrame][1]表示该页地址在未来是否出现(“是”用1表示,否则置0)。pageCapacity = new int[pageFrame][2];int currentPageFrame = 0;// 当前页框数// 用于检查用户内存容量是否有余for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {pageCapacity[currentPageFrame][0] = -1;}double pageFault = 0;// 缺页次数for(int k = 0; k < 400; k ++) {// 判断是否已存在该页地址for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][0] == pageAddresses[k]) {break;}}// 处理需插入新页地址的情况if(currentPageFrame == pageFrame) {// 当有剩余用户内存容量时for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][0] == -1) {pageCapacity[currentPageFrame][0] = pageAddresses[k];break;}}// 当需要置换页地址时if(currentPageFrame == pageFrame) {int replacement = 0;// 检查pageAddresses[k]之后是否出现页地址与现有页框内容重复for(int i = k + 1, flag = 0; i < 400; i ++) {for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][0] == pageAddresses[i]) {if(pageCapacity[currentPageFrame][1] == 0) {pageCapacity[currentPageFrame][1] = 1; // 标记该处与未来要访问的页地址重复flag ++;}break;}}if(flag == pageFrame - 1) { // 如果出现pageFrame-1次重复,则置换剩下那一个未出现重复的页地址break;}}// 找到页框中在未来不出现重复的第一个页地址for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][1] == 0) {replacement = currentPageFrame;break;}}pageCapacity[replacement][0] = pageAddresses[k];pageFault ++; // 增加缺页中断次数// 清楚检查痕迹for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {pageCapacity[currentPageFrame][1] = 0;}}}}accuracy[0][pageFrame - 4] =  1 - pageFault / 400;pageFault = 0; // 清空数据
}

FIFO算法命中率计算

public static void calculteFIFO(int[] pageAddresses, int pageFrame) {// pageCapacity[pageFrame][0]放置页地址;// pageCapacity[pageFrame][1]表示该页地址滞留在该页框的时长。pageCapacity = new int[pageFrame][2];int currentPageFrame = 0; // 当前页框数// 用于检查用户内存容量是否有余for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {pageCapacity[currentPageFrame][0] = -1;}double pageFault = 0; // 缺页次数for(int k = 0; k < 400; k ++) {// 判断是否已存在该页地址for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][0] == pageAddresses[k]) {// 增加页框中有效页地址的滞留时长for(int i = 0; i < pageFrame; i ++) {if(pageCapacity[i][0] != -1) {pageCapacity[i][1] ++;}}break;}}// 处理需插入新页地址的情况if(currentPageFrame == pageFrame) {// 当有剩余用户内存容量时for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][0] == -1) {pageCapacity[currentPageFrame][0] = pageAddresses[k];// 增加页框中有效页地址的滞留时长,当前页地址的滞留时长置为1for(int i = 0; i < pageFrame; i ++) {if(pageCapacity[i][0] != -1) {pageCapacity[i][1] ++;}}pageCapacity[currentPageFrame][1] = 1;break;}}// 当需要置换页地址时if(currentPageFrame == pageFrame) {int replacement = 0;// 比较选出当前滞留时长最大的页地址,出现相同情况则按顺序选取for(currentPageFrame = 1; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][1] > pageCapacity[replacement][1]) {replacement = currentPageFrame;}}pageCapacity[replacement][0] = pageAddresses[k];// 增加页框中各页地址的滞留时长,当前页地址的滞留时长置为1for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {pageCapacity[currentPageFrame][1] ++;}pageCapacity[replacement][1] = 1;pageFault ++; // 增加缺页中断次数}}}accuracy[1][pageFrame - 4] =  1 - pageFault / 400;pageFault = 0; // 清空数据
}

LRU算法命中率计算

public static void calculteLRU(int[] pageAddresses, int pageFrame) {// pageCapacity[pageFrame][0]放置页地址;// pageCapacity[pageFrame][1]表示该页地址的最新被访问时间值。pageCapacity = new int[pageFrame][2];int currentPageFrame = 0; // 当前页框数// 用于检查用户内存容量是否有余for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {pageCapacity[currentPageFrame][0] = -1;}double pageFault = 0; // 缺页次数for(int k = 0; k < 400; k ++) {// 判断是否已存在该页地址for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][0] == pageAddresses[k]) {pageCapacity[currentPageFrame][1] = 0;break;}}// 处理需插入新页地址的情况if(currentPageFrame == pageFrame) {// 当有剩余用户内存容量时for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][0] == -1) {pageCapacity[currentPageFrame][0] = pageAddresses[k];// 增加页框中有效页地址的最新被访问时间值,当前页地址的最新被访问时间值置为0for(int i = 0; i < pageFrame; i ++) {if(pageCapacity[i][0] != -1) {pageCapacity[i][1] ++;}}pageCapacity[currentPageFrame][1] = 0;break;}}// 当需要置换页地址时if(currentPageFrame == pageFrame) {int replacement = 0;// 比较选出当前最新被访问时间值最大的页地址,出现相同情况则按顺序选取for(currentPageFrame = 1; currentPageFrame < pageFrame; currentPageFrame ++) {if(pageCapacity[currentPageFrame][1] > pageCapacity[replacement][1]) {replacement = currentPageFrame;}}pageCapacity[replacement][0] = pageAddresses[k];// 增加页框中有效页地址的最新被访问时间值,当前页地址的最新被访问时间值置为0for(currentPageFrame = 0; currentPageFrame < pageFrame; currentPageFrame ++) {pageCapacity[currentPageFrame][1] ++;}pageCapacity[replacement][1] = 0;pageFault ++; // 增加缺页中断次数}}}accuracy[2][pageFrame - 4] =  1 - pageFault / 400;pageFault = 0; // 清空数据
}

FIFO与LRU的命中率大小对比

System.out.println("FIFO与LRU的命中率大小对比结果:");
// 用accuracy[3][0]、accuracy[3][1]和accuracy[3][2]记录三种对比结果出现次数的统计
for(int j = 0; j < 37; j ++) {if(accuracy[1][j] > accuracy[2][j]) {accuracy[3][0] ++;}else if(accuracy[1][j] == accuracy[2][j]) {accuracy[3][1] ++;}else {accuracy[3][2] ++;}
}
System.out.println("FIFO > LRU : "+ (int)accuracy[3][0] + "次");
System.out.println("FIFO = LRU : "+ (int)accuracy[3][1] + "次");
System.out.println("FIFO < LRU : "+ (int)accuracy[3][2] + "次");

bat文件制作

(1)将整个Java项目导出成一个jar包,如:PageReplacementAlgorithm.jar
(2)在jar包所在目录下新建txt文件,文件内容为:java -jar PageReplacementAlgorithm.jar
(3)将txt文件修改成bat文件,如:点我运行.bat
(4)双击“点我运行.bat”即可运行。

如果文章内容出错或者您有更好的解决方法,欢迎到评论区指正和讨论!

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

  1. 操作系统实验--页面置换算法(OPT/FIFO/LRU/LFU)cpp

    前言 学习笔记 void IntoPage(int m);//将第m条指令转化为对应的页数 int isInside(int number,int Msize);//判断页号是否在内存中 void O ...

  2. 操作系统课设之虚拟内存页面置换算法的模拟与实现

    前言 课程设计开始了,实验很有意思,写博客总结学到的知识 白嫖容易,创作不易,学到东西才是真 本文原创,创作不易,转载请注明!!! 本文链接 个人博客:https://ronglin.fun/arch ...

  3. 操作系统之页面置换算法(FIFO、LFU、LRU、OPT算法)

    操作系统之页面置换算法(FIFO.LFU.LRU.OPT算法) TIPS: 主存:实际上的物理内存. 虚存(虚拟内存):虚拟存储技术.虚拟内存使计算机系统内存管理的一种技术.它使得应用程序认为它拥有的 ...

  4. 操作系统:页面置换算法(FIFO算法、LRU算法、LFU算法、NRU算法)实验报告

    操作系统实验报告 一.实验名称 :页面置换算法 二.实验目的: 在实验过程中应用操作系统的理论知识. 三.实验内容: 采用C/C++编程模拟实现:FIFO算法.LRU算法.LFU算法.NRU算法四个页 ...

  5. 请求页式存储管理中页面置换算法的模拟设计_操作系统-存储管理与文件管理-笔记...

    存储管理 一.页式存储 将各进程的虚拟空间划分成若干个长度相等的页,页式管理把内存空间按页的大小划分成片或者页面,然后把页式虚拟地址与内存地址建立一一对应页表,并用相应的硬件地址变换机构,来解决离散地 ...

  6. 操作系统实验四-LRU算法的模拟

    操作系统实验四:页式虚拟存储管理的模拟 一.实验目的: 掌握存储管理的基本原理.地址变换过程:用软件实现地址转换过程:用一种常用的页面置换算法来处理缺页中断并研究其命中率. 二.实验题目: 1.模拟请 ...

  7. 先进先出页面置换算法的模拟(c++实现)

    实验要求 1)设计模拟实现OPT.FIFO和LRU页面置换算法中的任意一种. OPT算法:需要发生页面置换时,算法总是选择在将来最不可能访问的页面进行置换. FIFO算法:算法总是选择在队列中等待时间 ...

  8. 【操作系统】页面置换算法

    页面置换算法 在进程运行过程中,若需要访问的物理块不在内存中,就需要通过一定的方式来将页面载入内存,而此时内存很可能已无空闲空间,因此就需要一定的算法来选择内存中要被置换的页面,这种算法就被称为页面置 ...

  9. 操作系统:页面置换算法(LRU、FIFO、OPT)

    继续重温操作系统系列知识,页面置换的三种常见算法为:LRU(最近最久未使用).FIFO(先进先出).最佳置换. 部分公司的面试会考到LRU的知识. LRU置换算法 所谓LRU置换算法,单看字面意思较为 ...

最新文章

  1. 《评人工智能如何走向新阶段》后记(再续1)
  2. shllter自动和手动实例
  3. 李宏毅自然语言处理——成分句法分析
  4. 报错’TypeError: only integer scalar arrays can be converted to a scalar index‘
  5. [Python]小甲鱼Python视频第020课(函数:内嵌函数和闭包)课后题及参考解答
  6. 自定义Dialog的小实战——根据地区选择手机号码前缀
  7. CSDN开发者云平台体验
  8. java List转 Stingt和 Sting转List 方法
  9. 芯片烧录器编程AT24C02
  10. GitLab Admin Area
  11. 2020同济大学电子与信息工程学院计算机系夏令营机试题目
  12. 查看XBox360的系统版本信息
  13. 基于python/scipy学习概率统计(3):正态分布
  14. 图像处理--最大内接矩形
  15. android+农历月份大小压缩表,部分日期农历新历转换会崩溃
  16. 什么是XSL,它有什么用途
  17. halocn标定找旋转中心_HALOCN运算功能函数快查 | 学步园
  18. 基于matlab的混合波束成形仿真
  19. Python制作翻译工具(程序员必备中英文翻译工具)
  20. 工作之余享受一下天籁之音(千千静听音效插件)

热门文章

  1. 2015 国际程序员节
  2. 闲鱼X-Sign算法闲鱼抓包方法
  3. 使用procedure analyse()分析mysql给出的关于表结构的优化建议
  4. python如何操作excel数据_Python如何操作Excel
  5. 中国空间站航天员首次出舱,三位航天员都有哪些任务?
  6. 服务器租用一般价格是多少,如何选择服务商
  7. 大数据引领 开创发展新局面
  8. 智能扫地机器人app开发,为行业发展提供新动能
  9. 女神节表白:因一个分号被拒!
  10. 【buu平台】[GXYCTF2019]BabySQli