页面置换算法Java版

  • 先进先出置换算法(FIFO)
  • 最近最久未使用置换算法(LRU)
  • 最佳置换算法(OPT)

帮女朋友写了份 Python版的,Python版戳这里

帮女朋友舍友写了份 C++ 版的,C++版戳这里

老样子,我做实验的原则都是不参考任何网上代码,made by myself。

可能实现的不是很好,但是至少效果达到了。

不过这次实验简单到爆了~应该怎么写都能写出来,以下为源码:

先进先出置换算法(FIFO)

import java.util.Scanner;
import java.util.Stack;/*** FIFO页面替换算法* Author:陆振宇* time:2019.11.30*/
public class FIFO {int frameNum;    // 分配给该作业的物理页框数int[] pageFrame; // 物理页框int pageNum;     // 作业的页面走向总次数int[] page;      // 作业的页面走向Stack<Integer> stack = new Stack<>(); // 存放淘汰页面的栈// Set<Integer> set = new TreeSet<>();  // 存放淘汰页面的set集合private void fifoRun() {Scanner scanner = new Scanner(System.in);System.out.print("请输入分配给该作业的物理页框块数:");this.frameNum = scanner.nextInt();     // 物理页框数System.out.print("请输入该作业的页面走向:");scanner.nextLine(); // 控制输入格式String inputPages = scanner.nextLine();String[] split = inputPages.split("\\s+|,|,");this.pageNum = split.length;    // 作业的页面走向总次数page = new int[pageNum];        // 作业的页面走向for (int i = 0; i < pageNum; i++) {this.page[i] = Integer.parseInt(split[i]);}pageFrame = new int[frameNum];     // 物理页框int pageMissNum = 0;   // 缺页次数int count = 0;int helpNum = 0;    // 实现 FIFO 算法while (count < pageNum) {System.out.println("第" + (count+1) + "次:");boolean isMiss = true;    // 判断本次是否缺页boolean isEmpty = true;   // 判断物理页框中是否有空位boolean isExist = false; // 判断物理页框中是否存在本次页面走向// 判断物理页框中是否已经存在本次页面走向for (int i = 0; i < frameNum; i++) {if (page[count] == pageFrame[i]) {isExist = true;break;}}// 若本次页面走向,物理页框中已存在,则直接进入下次页面走向if (isExist == true){System.out.println("本次页面走向,页框中已经存在!");System.out.print("目前物理页框中页面走向为:");for (int i : pageFrame) {System.out.print(i + " ");}System.out.println();count++;continue;}// 判断物理页框有无空位for (int i = 0 ; i < frameNum ; i++){if (pageFrame[i] == 0){isEmpty = true;break;}else{isEmpty = false;}}// 本次页面走向,物理页框中不存在,且有空位,按顺序放入if (isExist == false && isEmpty == true){for (int i = 0; i < frameNum; i++) {if (pageFrame[i] == 0) {    // 物理页框中有空位则放入pageFrame[i] = page[count];break;      // 从头开始找,找到一个空位即可}}}// 实现 FIFO 算法// 本次页面走向,物理页框中不存在,且物理页框中没有空位了if (isExist == false && isEmpty == false){// 此时的 pageFrame[helpNum%frameNum] 为淘汰页面stack.push(pageFrame[helpNum%frameNum]);   // 淘汰页面入栈System.out.println("本次淘汰页面:" + pageFrame[helpNum%frameNum]);pageFrame[helpNum%frameNum] = page[count]; // 先进先出helpNum++;}if (isMiss == true){  // 计算缺页次数pageMissNum++;}System.out.print("目前物理页框中页面走向为:");for (int i : pageFrame) {System.out.print(i + " ");}System.out.println();count++;}System.out.println();System.out.println("缺页次数:" + pageMissNum + "次");System.out.println("一共调用: " + pageNum + "次");System.out.println("缺页中断率:" + pageMissNum*1.0/pageNum*100 + "%" );System.out.print("淘汰页面:");for (Integer integer : stack) {System.out.print(integer + " ");}}public static void main(String[] args) {FIFO fifo = new FIFO();fifo.fifoRun();}}

运行效果:

请输入分配给该作业的物理页框块数:3
请输入该作业的页面走向:2 3 2 1 5 2 4 5 3 2 5 2
第1次:
目前物理页框中页面走向为:2 0 0
第2次:
目前物理页框中页面走向为:2 3 0
第3次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 0
第4次:
目前物理页框中页面走向为:2 3 1
第5次:
本次淘汰页面:2
目前物理页框中页面走向为:5 3 1
第6次:
本次淘汰页面:3
目前物理页框中页面走向为:5 2 1
第7次:
本次淘汰页面:1
目前物理页框中页面走向为:5 2 4
第8次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:5 2 4
第9次:
本次淘汰页面:5
目前物理页框中页面走向为:3 2 4
第10次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:3 2 4
第11次:
本次淘汰页面:2
目前物理页框中页面走向为:3 5 4
第12次:
本次淘汰页面:4
目前物理页框中页面走向为:3 5 2 缺页次数:9次
一共调用: 12次
缺页中断率:75.0%
淘汰页面:2 3 1 5 2 4

最近最久未使用置换算法(LRU)

import java.util.Scanner;
import java.util.Stack;/*** LRU最近最久未使用页面置换算法* Author:陆振宇* time:2019.11.30*/
public class LRU {int frameNum;    // 分配给该作业的物理页框数int[] pageFrame; // 物理页框int pageNum;     // 作业的页面走向总次数int[] pages;      // 作业的页面走向Stack<Integer> stack = new Stack<>(); // 存放淘汰页面的栈private void lruRun() {Scanner scanner = new Scanner(System.in);System.out.print("请输入分配给该作业的物理页框块数:");this.frameNum = scanner.nextInt();     // 物理页框数System.out.print("请输入该作业的页面走向:");scanner.nextLine(); // 控制输入格式String inputPages = scanner.nextLine();String[] split = inputPages.split("\\s+|,|,");this.pageNum = split.length;    // 作业的页面走向总次数pages = new int[pageNum];        // 作业的页面走向for (int i = 0; i < pageNum; i++) {this.pages[i] = Integer.parseInt(split[i]);}pageFrame = new int[frameNum];     // 物理页框int pageMissNum = 0;   // 缺页次数int count = 0;while (count < pageNum) {System.out.println("第" + (count+1) + "次:");boolean isMiss = true;    // 判断本次是否缺页boolean isEmpty = true;   // 判断物理页框中是否有空位boolean isExist = false; // 判断物理页框中是否存在本次页面走向// Queue<Integer> usedPage = new LinkedList<>();   // 保存之前的页面走向// usedPage.offer(pages[count]);   // 将页面走向进队// 判断物理页框中是否已经存在本次页面走向for (int i = 0; i < frameNum; i++) {if (pages[count] == pageFrame[i]) {isExist = true;break;}}// 若本次页面走向,物理页框中已存在,则直接进入下次页面走向if (isExist == true){System.out.println("本次页面走向,页框中已经存在!");System.out.print("目前物理页框中页面走向为:");for (int i : pageFrame) {System.out.print(i + " ");}System.out.println();count++;continue;}// 判断物理页框有无空位for (int i = 0 ; i < frameNum ; i++){if (pageFrame[i] == 0){isEmpty = true;break;}else{isEmpty = false;}}// 本次页面走向,物理页框中不存在,且有空位,按顺序放入if (isExist == false && isEmpty == true){for (int i = 0; i < frameNum; i++) {if (pageFrame[i] == 0) {    // 物理页框中有空位则放入pageFrame[i] = pages[count];break;      // 从头开始找,找到一个空位即可}}}// 本次页面走向,物理页框中不存在,且物理页框中没有空位了// 实现 LRU 算法if (!isExist && !isEmpty){for (int i = 0 ; i < frameNum ; i++){if (pages[count-frameNum] == pageFrame[i]){stack.push(pageFrame[i]);   // 淘汰页面入栈pageFrame[i] = pages[count];}}}if (isMiss == true){  // 计算缺页次数pageMissNum++;}System.out.print("目前物理页框中页面走向为:");for (int i : pageFrame) {System.out.print(i + " ");}System.out.println();count++;}System.out.println();System.out.println("缺页次数:" + pageMissNum + "次");System.out.println("一共调用: " + pageNum + "次");System.out.println("缺页中断率:" + pageMissNum*1.0/pageNum*100 + "%" );System.out.print("淘汰页面:");for (Integer integer : stack) {System.out.print(integer + " ");}}public static void main(String[] args) {LRU lru = new LRU();lru.lruRun();}}

运行结果:

请输入分配给该作业的物理页框块数:3
请输入该作业的页面走向:2 3 2 1 5 2 4 5 3 2 5 2
第1次:
目前物理页框中页面走向为:2 0 0
第2次:
目前物理页框中页面走向为:2 3 0
第3次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 0
第4次:
目前物理页框中页面走向为:2 3 1
第5次:
目前物理页框中页面走向为:2 5 1
第6次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 5 1
第7次:
目前物理页框中页面走向为:2 5 4
第8次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 5 4
第9次:
目前物理页框中页面走向为:3 5 4
第10次:
目前物理页框中页面走向为:3 5 2
第11次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:3 5 2
第12次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:3 5 2 缺页次数:7次
一共调用: 12次
缺页中断率:58.333333333333336%
淘汰页面:3 1 2 4

最佳置换算法(OPT)

import java.util.Scanner;
import java.util.Stack;/*** OPT最佳页面置换算法* Author:陆振宇* time:2019.11.30*/
public class OPT {int pageFrameNum;    // 分配给该作业的物理页框数int[] pageFrame; // 物理页框int pageFrontNum;     // 作业的页面走向总次数int[] pages;      // 作业的页面走向Stack<Integer> stack = new Stack<>(); // 存放淘汰页面的栈private void optRun() {Scanner scanner = new Scanner(System.in);System.out.print("请输入分配给该作业的物理页框块数:");this.pageFrameNum = scanner.nextInt();     // 物理页框数System.out.print("请输入该作业的页面走向:");scanner.nextLine(); // 控制输入格式String inputPages = scanner.nextLine();String[] split = inputPages.split("\\s+|,|,");this.pageFrontNum = split.length;    // 作业的页面走向总次数pages = new int[pageFrontNum];        // 作业的页面走向for (int i = 0; i < pageFrontNum; i++) {this.pages[i] = Integer.parseInt(split[i]);}pageFrame = new int[pageFrameNum];     // 物理页框int pageMissNum = 0;   // 缺页次数int count = 0;while (count < pageFrontNum) {System.out.println("第" + (count+1) + "次:");boolean isMiss = true;    // 判断本次是否缺页boolean isEmpty = true;   // 判断物理页框中是否有空位boolean isExist = false; // 判断物理页框中是否存在本次页面走向// 判断物理页框中是否已经存在本次页面走向for (int i = 0; i < pageFrameNum; i++) {if (pages[count] == pageFrame[i]) {isExist = true;break;}}// 若本次页面走向,物理页框中已存在,则直接进入下次页面走向if (isExist == true){System.out.println("本次页面走向,页框中已经存在!");System.out.print("目前物理页框中页面走向为:");for (int i : pageFrame) {System.out.print(i + " ");}System.out.println();count++;continue;}// 判断物理页框有无空位for (int i = 0; i < pageFrameNum; i++){if (pageFrame[i] == 0){isEmpty = true;break;}else{isEmpty = false;}}// 本次页面走向,物理页框中不存在,且有空位,按顺序放入if (isExist == false && isEmpty == true){for (int i = 0; i < pageFrameNum; i++) {if (pageFrame[i] == 0) {    // 物理页框中有空位则放入pageFrame[i] = pages[count];break;      // 从头开始找,找到一个空位即可}}}// 本次页面走向,物理页框中不存在,且物理页框中没有空位了// 实现 OPT 算法if (isExist == false && isEmpty == false){boolean isExistEle = false; // 是否存在未来不再出现的元素boolean isFound = false;    // 是否找到未来下标的元素int frameIndex = 0; // 记录的物理页框下标Stack<Integer> helpStack = new Stack<>(); // 辅助栈// 寻找将来不再出现的,存在于当前物理页框中的元素for (int i = 0 ; i < pageFrameNum ; i++){for (int j = count ; j < pageFrontNum ; j++){if (pageFrame[i] == pages[j]){  // 若当前物理页框中,不存在未来不再出现的元素helpStack.push(j);  // 记录当前未来将遇见的下标isFound = true;     // 找到未来下标的元素}}// 当前物理页框中,存在未来不再出现的元素if (!isFound){frameIndex = i; // 记录当前物理页框isExistEle = true; // 存在未来不再出现的元素break;}isFound = false;}/*for (Integer integer : helpStack) {System.out.println(integer);}System.out.println("TEST  " + frameIndex);System.out.println("isExistEle  " + isExistEle);System.out.println("isFound  " + isFound);*/if(isExistEle){ // 存在未来不再出现的元素stack.push(pageFrame[frameIndex]); // 淘汰页面入栈pageFrame[frameIndex] = pages[count];}else{ // 不存在未来不再出的元素int t = 0;for (Integer integer : helpStack) {if(t < integer){t = integer;}}for (int i = 0 ; i < pageFrameNum ; i++){if (pageFrame[i] == pages[t]){stack.push(pageFrame[i]);  // 淘汰页面入栈pageFrame[i] = pages[count];}}}}if (isMiss == true){  // 计算缺页次数pageMissNum++;}System.out.print("目前物理页框中页面走向为:");for (int i : pageFrame) {System.out.print(i + " ");}System.out.println();count++;}System.out.println();System.out.println("缺页次数:" + pageMissNum + "次");System.out.println("一共调用: " + pageFrontNum + "次");System.out.println("缺页中断率:" + pageMissNum*1.0/ pageFrontNum *100 + "%" );System.out.print("淘汰页面:");for (Integer integer : stack) {System.out.print(integer + " ");}}public static void main(String[] args) {OPT opt = new OPT();opt.optRun();}}

运行效果:

请输入分配给该作业的物理页框块数:3
请输入该作业的页面走向:2 3 2 1 5 2 4 5 3 2 5 2
第1次:
目前物理页框中页面走向为:2 0 0
第2次:
目前物理页框中页面走向为:2 3 0
第3次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 0
第4次:
目前物理页框中页面走向为:2 3 1
第5次:
目前物理页框中页面走向为:2 3 5
第6次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 5
第7次:
目前物理页框中页面走向为:4 3 5
第8次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:4 3 5
第9次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:4 3 5
第10次:
目前物理页框中页面走向为:2 3 5
第11次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 5
第12次:
本次页面走向,页框中已经存在!
目前物理页框中页面走向为:2 3 5 缺页次数:6次
一共调用: 12次
缺页中断率:50.0%
淘汰页面:1 2 4

【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版相关推荐

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

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

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

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

  3. 【南邮操作系统实验】银行家算法Java版

    这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法. 我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出. import java.util.*; /* ...

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

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

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

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

  6. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)

    页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...

  7. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) C++ 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 写好了 Java 版和 Python 版的- Java版这里 Python版戳这里 帮女朋友舍友写 ...

  8. 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版

    页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈 Java版戳 ...

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

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

最新文章

  1. Linux C编程--临时文件
  2. mysql 重置更新祖级字段
  3. C++新特性探究(13.5):右值引用
  4. SQL Server2005创建新数据库时不允许创建新数据库的问题
  5. 蓝屏代码PAGE_FAULT_IN_NONPAGED_AREA的解决方法
  6. java 累进计费率计算_税点点分享第198期:案例解答个人所得税的计算公式
  7. jvm中的新生代Eden和survivor区
  8. lzw编码 matlab,LZW编码算法matlab实现.docx
  9. 分区魔术师于分区助手怎么选择
  10. win7旗舰版上装VS2010错误(提示:miicrosoft 应用程序报告[安装失败])
  11. iOS 手势解锁密码
  12. 汶川地震亲历者:唯有经历过惊惶失策,才不至于“花容失色
  13. 华为服务器虚拟kvm退出全屏,kvm虚拟机全屏快捷键
  14. Adobe Premiere Rush最新升级 终于支持M1芯片了
  15. h5 监听安卓物理返回键
  16. php array_diff_assoc,关于array_diff_assoc的详细介绍
  17. Matlab入门基础_三
  18. idea中搭建基于maven的ssm整合框架
  19. .npy .npz 文件-numpy的文件存储
  20. ORMLite的集成和使用

热门文章

  1. 电脑主机换了什么东西才需要重新安装系统?
  2. 对话框:创建对话框模板和修改对话框属性
  3. IDEA的创建javaWeb工程以及修改默认的class文件输出
  4. Mybatis_day3_Mybatis的动态SQL
  5. 基准风险因子暴露度_具有性能基准SQL Server索引填充因子
  6. 使用PowerShell和SQL的示例可用性监视服务的插图
  7. hdu 2586 How far away ?(LCA模板)(倍增法)
  8. [luogu2680] 运输计划 (lca+二分+树上差分)
  9. SC命令---安装、开启、配置、关闭windows服务 bat批处理(转载)
  10. 程序设计中的数学思维函数总结(代码以C#为例)