【南邮操作系统实验】页面置换算法 (FIFO、LRU、OPT)Java 版
页面置换算法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 版相关推荐
- 操作系统实验--页面置换算法(OPT/FIFO/LRU/LFU)cpp
前言 学习笔记 void IntoPage(int m);//将第m条指令转化为对应的页数 int isInside(int number,int Msize);//判断页号是否在内存中 void O ...
- 操作系统:页面置换算法(LRU、FIFO、OPT)
继续重温操作系统系列知识,页面置换的三种常见算法为:LRU(最近最久未使用).FIFO(先进先出).最佳置换. 部分公司的面试会考到LRU的知识. LRU置换算法 所谓LRU置换算法,单看字面意思较为 ...
- 【南邮操作系统实验】银行家算法Java版
这个是南邮通达的操作系统实验,实验内容相对比较简单,就是实现一下银行家算法. 我没有参考任何源码,纯属 made by myself,如果差错,欢迎指出. import java.util.*; /* ...
- 操作系统之页面置换算法(FIFO、LFU、LRU、OPT算法)
操作系统之页面置换算法(FIFO.LFU.LRU.OPT算法) TIPS: 主存:实际上的物理内存. 虚存(虚拟内存):虚拟存储技术.虚拟内存使计算机系统内存管理的一种技术.它使得应用程序认为它拥有的 ...
- 【操作系统】页面置换算法
页面置换算法 在进程运行过程中,若需要访问的物理块不在内存中,就需要通过一定的方式来将页面载入内存,而此时内存很可能已无空闲空间,因此就需要一定的算法来选择内存中要被置换的页面,这种算法就被称为页面置 ...
- 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT)图形化界面(JavaFx)
页面置换算法图形化界面 前言 运行效果 源码 FIFO LRU OPT FXML界面 控制器 启动类 前言 其实以前操作系统实验的时候我写过了三份了:(命令行) 页面置换算法 (FIFO.LRU.OP ...
- 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) C++ 版
页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 写好了 Java 版和 Python 版的- Java版这里 Python版戳这里 帮女朋友舍友写 ...
- 【南邮操作系统实验】页面置换算法(FIFO、LRU、OPT) Python 版
页面置换算法 先进先出置换算法(FIFO) 最近最久未使用置换算法(LRU) 最佳置换算法(OPT) 本来已经写好一份 Java 版的了,然后又帮女朋友写了一份 Python 版,啊哈哈 Java版戳 ...
- 操作系统:页面置换算法(FIFO算法、LRU算法、LFU算法、NRU算法)实验报告
操作系统实验报告 一.实验名称 :页面置换算法 二.实验目的: 在实验过程中应用操作系统的理论知识. 三.实验内容: 采用C/C++编程模拟实现:FIFO算法.LRU算法.LFU算法.NRU算法四个页 ...
最新文章
- Linux C编程--临时文件
- mysql 重置更新祖级字段
- C++新特性探究(13.5):右值引用
- SQL Server2005创建新数据库时不允许创建新数据库的问题
- 蓝屏代码PAGE_FAULT_IN_NONPAGED_AREA的解决方法
- java 累进计费率计算_税点点分享第198期:案例解答个人所得税的计算公式
- jvm中的新生代Eden和survivor区
- lzw编码 matlab,LZW编码算法matlab实现.docx
- 分区魔术师于分区助手怎么选择
- win7旗舰版上装VS2010错误(提示:miicrosoft 应用程序报告[安装失败])
- iOS 手势解锁密码
- 汶川地震亲历者:唯有经历过惊惶失策,才不至于“花容失色
- 华为服务器虚拟kvm退出全屏,kvm虚拟机全屏快捷键
- Adobe Premiere Rush最新升级 终于支持M1芯片了
- h5 监听安卓物理返回键
- php array_diff_assoc,关于array_diff_assoc的详细介绍
- Matlab入门基础_三
- idea中搭建基于maven的ssm整合框架
- .npy .npz 文件-numpy的文件存储
- ORMLite的集成和使用
热门文章
- 电脑主机换了什么东西才需要重新安装系统?
- 对话框:创建对话框模板和修改对话框属性
- IDEA的创建javaWeb工程以及修改默认的class文件输出
- Mybatis_day3_Mybatis的动态SQL
- 基准风险因子暴露度_具有性能基准SQL Server索引填充因子
- 使用PowerShell和SQL的示例可用性监视服务的插图
- hdu 2586 How far away ?(LCA模板)(倍增法)
- [luogu2680] 运输计划 (lca+二分+树上差分)
- SC命令---安装、开启、配置、关闭windows服务 bat批处理(转载)
- 程序设计中的数学思维函数总结(代码以C#为例)