页面置换算法图形化界面

  • 前言
    • 运行效果
  • 源码
    • FIFO
    • LRU
    • OPT
    • FXML界面
    • 控制器
    • 启动类

前言

其实以前操作系统实验的时候我写过了三份了:(命令行)
页面置换算法 (FIFO、LRU、OPT)Java 版
页面置换算法(FIFO、LRU、OPT) Python 版
页面置换算法(FIFO、LRU、OPT) C++ 版

这次的实验周女朋友恰好是这个题目,我就厚颜无耻的把以前自己的代码拿过来了(我抄我自己),但是什么都不做也不太好,就用 JavaFx 搭了个图形化界面(赤裸裸的摸鱼啊!)。。不过还发现以前的一些小问题,比如以前页框里的初值都是 0,应该用 null。

大致就长下面这样。。。

运行效果

源码

目录是这样的。

友情提示:虽然是图形化界面的,但是 FIFO、LRU、OPT 这三个文件单独运行也是可以的。

FIFO

package com.yusael.pagereplace;import java.util.Stack;public class FIFO {public  int frameNum;    // 分配给该作业的物理页框数public Integer[] pageFrame; // 物理页框public   int pageNum;     // 作业的页面走向总次数public Integer[] page;      // 作业的页面走向public Stack<Integer> stack = new Stack<>(); // 存放淘汰页面的栈public int pageMissNum = 0;   // 缺页次数public String fifoRun(int frameNum, String inputPages) {// Scanner scanner = new Scanner(System.in);// System.out.print("请输入分配给该作业的物理页框块数:");// this.frameNum = scanner.nextInt();     // 物理页框数this.frameNum = frameNum; // 物理页框数// System.out.print("请输入该作业的页面走向:");// scanner.nextLine(); // 控制输入格式// String inputPages = scanner.nextLine();String[] split = inputPages.split("\\s+|,\\s+|,\\s+|,");this.pageNum = split.length;    // 作业的页面走向总次数page = new Integer[pageNum];        // 作业的页面走向for (int i = 0; i < pageNum; i++) {this.page[i] = Integer.parseInt(split[i]);}pageFrame = new Integer[frameNum];     // 物理页框StringBuilder sb = new StringBuilder();int count = 0;int helpNum = 0;    // 实现 FIFO 算法while (count < pageNum) {// System.out.println("第" + (count+1) + "次:");sb.append("【第" + (count + 1) + "次】\n");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("目前物理页框中页面走向为:");sb.append("本次页面走向,页框中已经存在!\n");sb.append("目前物理页框中页面走向为:");for (Integer i : pageFrame) {// System.out.print(i + " ");sb.append(i + " ");}sb.append("\n---------------------------------------\n");count++;continue;}// 判断物理页框有无空位for (int i = 0 ; i < frameNum ; i++){if (pageFrame[i] == null){isEmpty = true;break;}else{isEmpty = false;}}// 本次页面走向,物理页框中不存在,且有空位,按顺序放入if (isExist == false && isEmpty == true){for (int i = 0; i < frameNum; i++) {if (pageFrame[i] == null) {    // 物理页框中有空位则放入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]);sb.append("本次淘汰页面:" + pageFrame[helpNum%frameNum] + "\n");pageFrame[helpNum%frameNum] = page[count]; // 先进先出helpNum++;}if (isMiss == true){  // 计算缺页次数pageMissNum++;}// System.out.print("目前物理页框中页面走向为:");sb.append("目前物理页框中页面走向为:");for (Integer i : pageFrame) {// System.out.print(i + " ");sb.append(i + " ");}// System.out.println();sb.append("\n---------------------------------------\n");count++;}// System.out.println();sb.append("\n");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 + " ");}return sb.toString();}public static void main(String[] args) {FIFO fifo = new FIFO();String s = fifo.fifoRun(3, "2 3 2 1 5 2 4 5 3 2 5 2");System.out.println(s);}}

LRU

package com.yusael.pagereplace;import java.util.Stack;public class LRU {public int frameNum;    // 分配给该作业的物理页框数public Integer[] pageFrame; // 物理页框public int pageNum;     // 作业的页面走向总次数public Integer[] pages;      // 作业的页面走向public Stack<Integer> stack = new Stack<>(); // 存放淘汰页面的栈public int pageMissNum = 0;   // 缺页次数public String lruRun(int frameNum, String inputPages) {this.frameNum = frameNum; // 物理页框数String[] split = inputPages.split("\\s+|,\\s+|,\\s+|,");this.pageNum = split.length;    // 作业的页面走向总次数pages = new Integer[pageNum];        // 作业的页面走向for (int i = 0; i < pageNum; i++) {this.pages[i] = Integer.parseInt(split[i]);}pageFrame = new Integer[frameNum];     // 物理页框StringBuilder sb = new StringBuilder();int count = 0;while (count < pageNum) {sb.append("【第" + (count + 1) + "次】\n");boolean isMiss = true;    // 判断本次是否缺页boolean isEmpty = true;   // 判断物理页框中是否有空位boolean isExist = false; // 判断物理页框中是否存在本次页面走向// 判断物理页框中是否已经存在本次页面走向for (int i = 0; i < frameNum; i++) {if (pages[count] == pageFrame[i]) {isExist = true;break;}}// 若本次页面走向,物理页框中已存在,则直接进入下次页面走向if (isExist == true){sb.append("本次页面走向,页框中已经存在!\n");sb.append("目前物理页框中页面走向为:");for (Integer i : pageFrame) {sb.append(i + " ");}sb.append("\n---------------------------------------\n");count++;continue;}// 判断物理页框有无空位for (int i = 0 ; i < frameNum ; i++){if (pageFrame[i] == null){isEmpty = true;break;}else{isEmpty = false;}}// 本次页面走向,物理页框中不存在,且有空位,按顺序放入if (isExist == false && isEmpty == true){for (int i = 0; i < frameNum; i++) {if (pageFrame[i] == null) {    // 物理页框中有空位则放入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++;}sb.append("目前物理页框中页面走向为:");for (Integer i : pageFrame) {sb.append(i + " ");}sb.append("\n---------------------------------------\n");count++;}sb.append("\n");return sb.toString();/* 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();String s = lru.lruRun(3, "2 3 2 1 5 2 4 5 3 2 5 2");System.out.println(s);}}

OPT

package com.yusael.pagereplace;import java.util.Stack;public class OPT {public int frameNum;    // 分配给该作业的物理页框数public Integer[] pageFrame; // 物理页框public int pageNum;     // 作业的页面走向总次数public Integer[] pages;      // 作业的页面走向public Stack<Integer> stack = new Stack<>(); // 存放淘汰页面的栈public int pageMissNum = 0;   // 缺页次数public String optRun(int frameNum, String inputPages) {this.frameNum = frameNum; // 物理页框数String[] split = inputPages.split("\\s+|,\\s+|,\\s+|,");this.pageNum = split.length;    // 作业的页面走向总次数pages = new Integer[pageNum];        // 作业的页面走向for (int i = 0; i < pageNum; i++) {this.pages[i] = Integer.parseInt(split[i]);}pageFrame = new Integer[frameNum];     // 物理页框StringBuilder sb = new StringBuilder();int count = 0;while (count < pageNum) {sb.append("【第" + (count + 1) + "次】\n");boolean isMiss = true;    // 判断本次是否缺页boolean isEmpty = true;   // 判断物理页框中是否有空位boolean isExist = false; // 判断物理页框中是否存在本次页面走向// 判断物理页框中是否已经存在本次页面走向for (int i = 0; i < this.frameNum; i++) {if (pages[count] == pageFrame[i]) {isExist = true;break;}}// 若本次页面走向,物理页框中已存在,则直接进入下次页面走向if (isExist == true){sb.append("本次页面走向,页框中已经存在!\n");sb.append("目前物理页框中页面走向为:");for (Integer i : pageFrame) {sb.append(i + " ");}sb.append("\n---------------------------------------\n");count++;continue;}// 判断物理页框有无空位for (int i = 0; i < this.frameNum; i++){if (pageFrame[i] == null){isEmpty = true;break;}else{isEmpty = false;}}// 本次页面走向,物理页框中不存在,且有空位,按顺序放入if (isExist == false && isEmpty == true){for (int i = 0; i < this.frameNum; i++) {if (pageFrame[i] == null) {    // 物理页框中有空位则放入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 < this.frameNum; i++){for (int j = count; j < pageNum; 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 < this.frameNum; i++){if (pageFrame[i] == pages[t]){stack.push(pageFrame[i]);  // 淘汰页面入栈pageFrame[i] = pages[count];}}}}if (isMiss == true){  // 计算缺页次数pageMissNum++;}sb.append("目前物理页框中页面走向为:");for (Integer i : pageFrame) {sb.append(i + " ");}sb.append("\n---------------------------------------\n");count++;}sb.append("\n");return sb.toString();}public static void main(String[] args) {OPT opt = new OPT();String s = opt.optRun(3, "2 3 2 1 5 2 4 5 3 2 5 2");System.out.println(s);}}

FXML界面

console.fxml:

<?xml version="1.0" encoding="UTF-8"?><?import javafx.scene.control.*?>
<?import javafx.scene.Cursor?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>
<?import javafx.scene.text.Text?>
<AnchorPane blendMode="MULTIPLY" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" pickOnBounds="false" prefHeight="350.0" prefWidth="700.0" stylesheets="@console.css" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.yusael.controller.Controller"><children><SplitPane dividerPositions="0.4475806451612903" prefHeight="350.0" prefWidth="700.0" style="-fx-background-color: lightskyblue" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0"><items><AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="398.0" prefWidth="283.0"><children><Text layoutX="18.0" layoutY="62.0" strokeType="OUTSIDE" strokeWidth="0.0" text="作业的物理页框块数:"><font><Font name="System Bold" size="18.0" /></font></Text><Text layoutX="21.0" layoutY="118.0" strokeType="OUTSIDE" strokeWidth="0.0" text="作业的页面走向:"><font><Font name="System Bold" size="18.0" /></font></Text><TextField fx:id="frameNum" layoutX="198.0" layoutY="40.0" opacity="0.8" prefHeight="30.0" prefWidth="66.0" style="-fx-background-color: deepskyblue" /><Button layoutX="40.0" layoutY="282.0" mnemonicParsing="false" onAction="#fifo" text="FIFO" /><Button layoutX="123.0" layoutY="282.0" mnemonicParsing="false" onAction="#lru" text="LRU" /><Button layoutX="205.0" layoutY="282.0" mnemonicParsing="false" onAction="#opt" text="OPT" /><TextArea fx:id="inputPages" layoutX="23.0" layoutY="139.0" opacity="0.8" prefHeight="110.0" prefWidth="247.0" style="-fx-background-color: deepskyblue" wrapText="true" /></children></AnchorPane><AnchorPane minHeight="0.0" minWidth="0.0" prefHeight="160.0" prefWidth="100.0"><children><TextArea fx:id="outputText" editable="false" layoutX="22.0" layoutY="17.0" opacity="0.8" prefHeight="237.0" prefWidth="344.0" style="-fx-background-color: deepskyblue" wrapText="true" /><Label fx:id="loseCount" layoutX="21.0" layoutY="269.0" text="缺页次数:"><cursor><Cursor fx:constant="HAND" /></cursor></Label><Label fx:id="callCount" layoutX="126.0" layoutY="269.0" text="一共调用:"><cursor><Cursor fx:constant="HAND" /></cursor></Label><Label fx:id="interupt" layoutX="242.0" layoutY="269.0" text="缺页中断率:"><cursor><Cursor fx:constant="HAND" /></cursor></Label><Label fx:id="ggPages" layoutX="22.0" layoutY="286.0" prefHeight="63.0" prefWidth="356.0" text="淘汰页面:" wrapText="true"><cursor><Cursor fx:constant="HAND" /></cursor></Label></children></AnchorPane></items></SplitPane></children>
</AnchorPane>

控制器

Controller.java:

package com.yusael.controller;import com.yusael.pagereplace.FIFO;
import com.yusael.pagereplace.LRU;
import com.yusael.pagereplace.OPT;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Alert;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TextField;
import javafx.scene.image.ImageView;import java.net.URL;
import java.util.ResourceBundle;public class Controller implements Initializable {@FXMLprivate TextField frameNum;@FXMLprivate TextArea inputPages;@FXMLprivate TextArea outputText;@FXMLprivate Label loseCount;@FXMLprivate Label callCount;@FXMLprivate Label interupt;@FXMLprivate Label ggPages;@FXMLprivate ImageView imView;public void fifo() {if (checkLegal(frameNum.getText(), inputPages.getText())) return;FIFO fifo = new FIFO();String res = fifo.fifoRun(Integer.parseInt(frameNum.getText()), inputPages.getText());outputText.setText(res);loseCount.setText("缺页次数:" + fifo.pageMissNum);callCount.setText("一共调用:" + fifo.pageNum);interupt.setText("缺页中断率:" + fifo.pageMissNum * 1.0 / fifo.pageNum * 100 + "%");StringBuilder sb = new StringBuilder();for (Integer integer : fifo.stack) {sb.append(integer + " ");}ggPages.setText("淘汰页面:" + sb.toString());}public void lru() {if (checkLegal(frameNum.getText(), inputPages.getText())) return;LRU lru = new LRU();String res = lru.lruRun(Integer.parseInt(frameNum.getText()), inputPages.getText());outputText.setText(res);loseCount.setText("缺页次数:" + lru.pageMissNum);callCount.setText("一共调用:" + lru.pageNum);interupt.setText("缺页中断率:" + lru.pageMissNum * 1.0 / lru.pageNum * 100 + "%");StringBuilder sb = new StringBuilder();for (Integer integer : lru.stack) {sb.append(integer + " ");}ggPages.setText("淘汰页面:" + sb.toString());}public void opt() {if (checkLegal(frameNum.getText(), inputPages.getText())) return;OPT opt = new OPT();String res = opt.optRun(Integer.parseInt(frameNum.getText()), inputPages.getText());outputText.setText(res);loseCount.setText("缺页次数:" + opt.pageMissNum);callCount.setText("一共调用:" + opt.pageNum);interupt.setText("缺页中断率:" + opt.pageMissNum * 1.0 / opt.pageNum * 100 + "%");StringBuilder sb = new StringBuilder();for (Integer integer : opt.stack) {sb.append(integer + " ");}ggPages.setText("淘汰页面:" + sb.toString());}private boolean checkLegal(String... texts) {for (String s : texts) {if (s == null || s.equals("")) {Alert alert = new Alert(Alert.AlertType.WARNING);alert.setTitle("Warning Dialog");alert.setHeaderText(null);alert.setContentText("请输入正确的数据!");alert.showAndWait();return true;}}return false;}@Overridepublic void initialize(URL location, ResourceBundle resources) {}
}

启动类

package com.yusael;import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;public class App extends Application {@Overridepublic void start(Stage primaryStage) throws Exception{Parent root = FXMLLoader.load(getClass().getResource("console.fxml"));primaryStage.setTitle("页面调度算法模拟");Scene scene = new Scene(root, 700, 350);scene.getStylesheets().add(getClass().getResource("console.css").toExternalForm());primaryStage.setScene(scene);primaryStage.setResizable(false);primaryStage.show();}public static void main(String[] args) {launch(args);}
}

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

  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)Java 版

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

  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. R语言head函数和tail函数获取dataframe、列表list、向量vector的头部和尾部数据:tail提取数据对象的尾部数据、head提取数据对象的头部数据、默认6条数据、自定义设置返回条数
  2. cocos2d-x游戏实例(1)-视角跟随主角
  3. TCP服务器端和客户端建立连接 - 服务器端的回调处理
  4. linux关闭交互模式,linux – 关闭cp(copy)命令的交互模式(cp:overwrite?)
  5. 实战突击:PHP项目开发案例整合(第2版)
  6. 897-递增顺序查找树
  7. GRE over IPSec 主备双链路冗余配置
  8. 2021信息安全工程师学习笔记(二十四)
  9. autocad2014 菜单栏 闪退_AutoCAD2014闪退解决办法
  10. 计算机无纸化考试合卷答题笔记卡,高级会计师无纸化考试攻略都在这 第一次考也不用慌...
  11. 航空产业已成境外情报机构重点网络攻击目标
  12. PAT_B1002 | 写出这个数
  13. 让台服客户端支持简体中文
  14. 利用51单片机+0.96寸iic接口oled显示图片或动图
  15. 程序员的高薪还能持续吗?
  16. vue虚拟DOM原理
  17. Android 模拟点击、滑动、返回
  18. 制药业中的自然语言处理(NLP)
  19. 洋姜的腌制方法 怎样腌制洋姜好吃
  20. QPSK解调过程中的抽样判决

热门文章

  1. 京东也准备向社区团购进发了?
  2. 你习惯用微信支付还是支付宝?
  3. C++STL库中的map容器
  4. windows上cppcheck检查不出任何错误解决
  5. dataframe索引筛选_筛选的索引:性能分析和隐藏成本
  6. easyUI+servlet+mysql项目总结
  7. Genymotion下载及安装(安卓虚拟机)
  8. 牛客小白月赛13 解题报告
  9. Ethereum 以太坊 交易数据 构建原理
  10. Linux Shell编程 - 正则表达式