当前位置: 首页 > news >正文

【操作系统】页面置换

要求:

        1、任意给出一组页面访问顺序(如页面走向是1、2、5、7、5、7、1、4、3、5、6、4、3、2、1、5、2)。

        2、分配给该作业一定的物理块(如3块、4块等)。

        3、利用某几种页面置换算法模拟页面置换过程并计算其缺页率并分析结果。

        4、通过给出特殊的页面访问顺序,分配不同的物理块,利用FIFO算法计算其缺页率,进一步理解Belady现象。

代码实现:

package test;
import java.util.*;
public class Main {private int[] pageSequence;    // 页面访问序列private int frameCount;    // 物理块数public Main(int[] pageSequence, int frameCount) {this.pageSequence = pageSequence;this.frameCount = frameCount;}public void fifo() {//FIFOSystem.out.println("FIFO算法:");Queue<Integer> queue = new LinkedList<>(); // 存放当前内存中的页面Set<Integer> set = new HashSet<>();       // 快速判断页面是否在内存中int pageFault = 0;                       // 缺页次数for (int i = 0; i < pageSequence.length; i++) {int page = pageSequence[i];System.out.print("访问页面" + page + ": ");if (set.contains(page)) {System.out.println("页面已在内存中");continue;}pageFault++;if (queue.size() < frameCount) {set.add(page);queue.add(page);System.out.println("调入页面" + page + ", 无换出");} else {                // 需要置换int outPage = queue.poll();set.remove(outPage);set.add(page);queue.add(page);System.out.println("调入页面" + page + ", 换出页面" + outPage);}}double rate = (double)pageFault / pageSequence.length;System.out.println("缺页次数: " + pageFault + ", 缺页率: " + String.format("%.2f", rate * 100) + "%");}public void lru() {//LRUSystem.out.println("LRU算法:");LinkedList<Integer> list = new LinkedList<>(); // 存放当前内存中的页面,按访问时间排序Set<Integer> set = new HashSet<>();           // 快速判断页面是否在内存中int pageFault = 0;                            // 缺页次数for (int i = 0; i < pageSequence.length; i++) {int page = pageSequence[i];System.out.print("访问页面" + page + ": ");if (set.contains(page)) {                // 页面在内存中,更新访问时间list.remove((Integer)page);list.addFirst(page);System.out.println("页面已在内存中,更新访问时间");continue;}pageFault++;if (list.size() < frameCount) {set.add(page);list.addFirst(page);System.out.println("调入页面" + page + ", 无换出");} else {                // 需要置换int outPage = list.removeLast();set.remove(outPage);set.add(page);list.addFirst(page);System.out.println("调入页面" + page + ", 换出页面" + outPage);}}double rate = (double)pageFault / pageSequence.length;System.out.println("缺页次数: " + pageFault + ", 缺页率: " + String.format("%.2f", rate * 100) + "%");}public void opt() {//OPTSystem.out.println("OPT算法:");List<Integer> frames = new ArrayList<>(); // 当前内存中的页面int pageFault = 0;                        // 缺页次数for (int i = 0; i < pageSequence.length; i++) {int page = pageSequence[i];System.out.print("访问页面" + page + ": ");if (frames.contains(page)) {System.out.println("页面已在内存中");continue;}pageFault++;if (frames.size() < frameCount) {                // 判断是否有空闲frames.add(page);System.out.println("调入页面" + page + ", 无换出");} else {int farthest = -1, replaceIdx = -1;                // 需要置换,找出未来最长时间不被访问的页面for (int j = 0; j < frames.size(); j++) {int nextUse = Integer.MAX_VALUE;for (int k = i + 1; k < pageSequence.length; k++) {if (pageSequence[k] == frames.get(j)) {nextUse = k;break;}}if (nextUse == Integer.MAX_VALUE) {replaceIdx = j;break;} else if (nextUse > farthest) {farthest = nextUse;replaceIdx = j;}}int outPage = frames.get(replaceIdx);frames.set(replaceIdx, page);System.out.println("调入页面" + page + ", 换出页面" + outPage);}}double rate = (double)pageFault / pageSequence.length;System.out.println("缺页次数: " + pageFault + ", 缺页率: " + String.format("%.2f", rate * 100) + "%");}public static void showBelady() {int[] beladySequence = {1, 2, 3, 4, 1, 2, 5, 1, 2, 3, 4, 5};System.out.println("Belady现象:");System.out.println("页面访问序列: " + Arrays.toString(beladySequence));// 分别用3个和4个物理块测试FIFO算法System.out.println("当物理块为3时");Main pr3 = new Main(beladySequence, 3);pr3.fifo();System.out.println("当物理块为4时");Main pr4 = new Main(beladySequence, 4);pr4.fifo();}public static void main(String[] args) {// 页面访问序列int[] sequence = {1, 2, 5, 7, 5, 7, 1, 4, 3, 5, 6, 4, 3, 2, 1, 5, 2};System.out.println("页面访问序列: " + Arrays.toString(sequence));System.out.println("当物理块为3时");Main pr = new Main(sequence, 3);pr.fifo();pr.lru();pr.opt();System.out.println("当物理块为4时");Main pr4 = new Main(sequence, 4);pr4.fifo();pr4.lru();pr4.opt();showBelady();        // Belady现象}
}

核心代码流程图:

FIFO算法流程图:                                                LRU算法流程图:         

  

OPT算法流程图:

 

运行结果:

当物理块为3时

当物理块为4时

FIFO算法的belady现象:

当物理块由3改为4时缺页率明显提升

http://www.lryc.cn/news/582009.html

相关文章:

  • OpenWebUI(2)源码学习-后端retrieval检索模块
  • vulnhub靶机渗透:PWNLAB: INIT
  • 海外短剧系统开发:PC端与H5端的全栈实践与深度解析
  • Java-66 深入浅出 分布式服务 Netty详解 EventLoop
  • [特殊字符] Excel 读取收件人 + Outlook 批量发送带附件邮件 —— Python 自动化实战
  • 嵌入式硬件中电容的基本原理与实现详解02
  • Excel 的多线程特性
  • 线程安全的单例模式与读者写者问题
  • WebRTC与RTMP
  • GPT5完全多模态架构拆解:实时视频生成如何颠覆内容创作
  • 什么是去中心化 AI?区块链驱动智能的初学者指南
  • 【C++指南】STL queue 完全解读(一):原理剖析与实战应用
  • 开源鸿蒙(OpenHarmony)桌面版全面解析:架构适配、设备支持与开发实战
  • Matlab自学笔记六十二:求解三角函数方程的通解周期解
  • 【JAVAFX】webview导入本地html并传入参数
  • 【论文笔记】World Models for Autonomous Driving: An Initial Survey
  • excel日志表介绍
  • C++学习笔记01(自学草稿)
  • 国民经济行业分类 GB/T 4754—2017 (PDF和exce版本)
  • 中电金信 :十问高质量数据集:金融大模型价值重塑有“据”可循
  • 【Unity笔记】Unity 粒子系统 Triggers 使用解析:监听粒子进入与离开区域并触发事件
  • maven 发布到中央仓库常用脚本-02
  • .NET9 实现 JSON 序列化和反序列化(Newtonsoft.Json System.Text.Json)性能测试
  • ArcGIS 水文分析升级:基于深度学习的流域洪水演进过程模拟
  • 3S技术+ArcGIS/ENVI全流程实战:水文、气象、灾害、生态、环境及卫生等领域应用
  • 语音交互新纪元:Hugging Face LeRobot如何让机器人真正“懂你”
  • validate CRI v1 image API for endpoint “unix:///run/containerd/containerd.sock“
  • 华为OD 2025B卷 机试 - 拼接URL (C++PythonJAVAJSC语言)
  • 用U盘启动制作centos系统最常见报错,系统卡住无法继续问题(手把手)
  • 深入解析与彻底解决 Android 集成 Flutter Boost 时页面闪烁问题