操作系统之虚拟存储管理 java python 实现 最优(Optimal)置换算法 先进先出(FIFO)页面置换算法 LRU(Least Recently Used)置换算法

时间:2025-04-04 08:55:54
package com.process.virtualstorage; import java.util.*; public class Optimal { /** * 设置分配的物理块数目pageNum * 页面号引用串 pageQueue */ int pageNum; ArrayList pageQueue; // 类唯一的构造器,只允许创建时直接确定好物理块数目一斤页面号引用串 public Optimal(int pageNum, ArrayList pageQueue) { this.pageNum = pageNum; this.pageQueue = pageQueue; } public void run() { // 定义物理块,初始化缺页次数 ArrayList physicalBlock = new ArrayList(pageNum); int missingNum = 0; int index = 0; Iterator itpQ = pageQueue.iterator(); while (itpQ.hasNext()) { Object page = itpQ.next(); // 查看本页是否在物理块中 if (!physicalBlock.contains(page)) { // 缺页则再根据物理块情况判断 missingNum++; // 物理块充足时无需替换,直接加入物理块中 if (physicalBlock.size() < pageNum) { physicalBlock.add(page); System.out.println("缺页" + page + ",无需置换,当前物理块" + physicalBlock); // 物理块不足时调用函数找出未来最远使用的一个 } else { List<Object> al = new ArrayList<Object>(pageQueue.subList(index+1, pageQueue.size())); Object farthest = findFarthest((ArrayList) al,physicalBlock); int farIndex = physicalBlock.indexOf(farthest); // 在物理块中替换 physicalBlock.set(farIndex, page); System.out.println("缺页" + page + ",置换" + farthest + "元素,当前物理块" + physicalBlock); } // 不缺页 } else { System.out.println("不缺页," + page + "在物理块" + physicalBlock + "中"); } index++; } System.out.println("缺页率为" + missingNum + "/" + pageQueue.size() + " = " + missingNum* 100 / pageQueue.size() + "%"); } // 找出物理块中最远使用的页面在物理块的索引以及页面号 public Object findFarthest(ArrayList alist, ArrayList pblist) { // 如果这个元素在后续列表中不存在,那么这是永远都用不到的,直接返回 for (Object item : pblist) { if (!alist.contains(item)) return item; } // 先默认要替换第一个页 Object farthest = pblist.get(0); // index如果找不到会报错,故先行处理找不到的情况 int last = alist.indexOf(pblist.get(0)); // 遍历整个物理块 for (Object item : pblist) { int now = alist.indexOf(item); // 如果这个元素比之前一个离得更远,就替换 if (last < now) { last = now; farthest = item; } } return farthest; } } class TestO{ public static void main(String[] args) { // 设置分配的物理块数目 int pageNum = 3; // 初始化页面号引用串 ArrayList pageQueue = new ArrayList(); int[] array = {7, 0, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0, 1, 7, 0, 1}; for (int i :array){ pageQueue.add(i); } Optimal op = new Optimal(pageNum, pageQueue); op.run(); } }