操作系统置换算法缺页率问题

该题置换算法求缺页率时,物理块为3,那前三个算不算缺页?有的题显示不算,有的题算

img

正常情况下,只要是内存里没有,就会引发缺页中断,然后去硬盘里加载
此时到底是加载到一个空位置,还是覆盖掉原有文件,其实资源消耗差不多,你算它不是缺页没有道理呀
你可以找个不算的题放出来看看,到底是它没有算缺页,还是你对题目本身理解的有偏差

  • 这有个类似的问题, 你可以参考下: https://ask.csdn.net/questions/7690755
  • 我还给你找了一篇非常好的博客,你可以看看是否有帮助,链接:算法之输入两个整数序列,第一个序列表示栈的压入顺序,请判断第二个序列是否可能为该栈的弹出顺序。
  • 除此之外, 这篇博客: 判断两个链表是否相交并找出交点,判断一个链表是否有环中的 方法三、快慢指针 部分也许能够解决你的问题, 你可以仔细阅读以下内容或跳转源博客中阅读:
  • 首先创建两个指针1和2(在java里就是两个对象引用),同时指向这个链表的头节点。然后开始一个大循环,在循环体中,让指针1每次向下移动一个节点,让指针2每次向下移动两个节点,然后比较两个指针指向的节点是否相同。如果相同,则判断出链表有环,如果不同,则继续下一次循环。

    例如链表A->B->C->D->B->C->D,两个指针最初都指向节点A,进入第一轮循环,指针1移动到了节点B,指针2移动到了C。第二轮循环,指针1移动到了节点C,指针2移动到了节点B。第三轮循环,指针1移动到了节点D,指针2移动到了节点D,此时两指针指向同一节点,判断出链表有环。

    此方法也可以用一个更生动的例子来形容:在一个环形跑道上,两个运动员在同一地点起跑,一个运动员速度快,一个运动员速度慢。当两人跑了一段时间,速度快的运动员必然会从速度慢的运动员身后再次追上并超过,原因很简单,因为跑道是环形的。

    /**
     * 判断单链表是否存在环
     * @param head
     * @return
     */
    public static <T> boolean isLoopList(ListNode<T> head){
        ListNode<T> slowPointer, fastPointer;
    
        //使用快慢指针,慢指针每次向前一步,快指针每次两步
        slowPointer = fastPointer = head;
        while(fastPointer != null && fastPointer.next != null){
            slowPointer = slowPointer.next;
            fastPointer = fastPointer.next.next;
    
            //两指针相遇则有环
            if(slowPointer == fastPointer){
                return true;
            }
        }
        return false;
    }
    

    假设从链表头节点到入环点的距离是D,链表的环长是S。那么循环会进行S次(为什么是S次,有心的同学可以自己揣摩下),可以简单理解为O(N)。除了两个指针以外,没有使用任何额外存储空间,所以空间复杂度是O(1)

  • 您还可以看一下 刘建萍老师的人工智能系列课程零基础讲解知识点和实例应用线性回归梯度下降逻辑回归课程中的 讲解机器学中会涉及到的有关数学方面的知识储备有哪些小节, 巩固相关知识点
  • 以下回答由chatgpt基于相关博客总结生成:

    根据问题描述,该问题是关于绿色巴士公司的换车问题。要确认在置换算法中,当三辆车被置换时是否应该算作缺页。

    从提供的参考资料中并没有具体解答该问题的相关信息,所以我们需要另外寻找解决方案。

    解决该问题的一种方法是参考操作系统中置换算法的原理和逻辑。经典的置换算法有FIFO、LRU、OPT等。这些算法中,如果要置换的页面是已经加载到内存中的页面,那么应该算作缺页,因为这些页面在当前内存中已经被替换掉了。而对于还未加载到内存中的页面,由于其不在内存中,所以无法被置换,不算作缺页。

    所以对于绿色巴士公司而言,如果前三辆车被置换了,且这些车辆已经在内存中,那么应该算作缺页,因为这些车辆被替换掉了。如果这些车辆还未加载到内存中,则不算作缺页。

    具体的实现代码如下:

    public class PageReplacement {
        private Queue<Integer> cars;  // 内存中存放车辆的队列
        private Set<Integer> loadedCars;  // 已经加载到内存中的车辆集合
        private int pageSize;  // 内存的大小
    
        public PageReplacement(int pageSize) {
            this.cars = new LinkedList<>();
            this.loadedCars = new HashSet<>();
            this.pageSize = pageSize;
        }
    
        public boolean isPageFault(int carNumber) {
            if (loadedCars.contains(carNumber)) {
                // 该车辆在当前内存中已经存在,算作缺页
                return true;
            } else {
                if (cars.size() < pageSize) {
                    // 内存未满,加载该车辆到内存中
                    cars.offer(carNumber);
                    loadedCars.add(carNumber);
                } else {
                    // 内存已满,置换掉最早的车辆
                    int oldestCar = cars.poll();
                    loadedCars.remove(oldestCar);
                    cars.offer(carNumber);
                    loadedCars.add(carNumber);
                }
                // 该车辆不在当前内存中,不算作缺页
                return false;
            }
        }
    }
    
    // 测试代码
    public class PageReplacementTest {
        public static void main(String[] args) {
            PageReplacement pageReplacement = new PageReplacement(3);  // 假设内存大小为3辆车
            boolean isPageFault = pageReplacement.isPageFault(1);
            System.out.println("Is page fault: " + isPageFault);  // 首次加载车辆1,不算作缺页
    
            isPageFault = pageReplacement.isPageFault(2);
            System.out.println("Is page fault: " + isPageFault);  // 首次加载车辆2,不算作缺页
    
            isPageFault = pageReplacement.isPageFault(3);
            System.out.println("Is page fault: " + isPageFault);  // 首次加载车辆3,不算作缺页
    
            isPageFault = pageReplacement.isPageFault(4);
            System.out.println("Is page fault: " + isPageFault);  // 车辆1被置换,算作缺页
    
            isPageFault = pageReplacement.isPageFault(5);
            System.out.println("Is page fault: " + isPageFault);  // 车辆2被置换,算作缺页
    
            isPageFault = pageReplacement.isPageFault(6);
            System.out.println("Is page fault: " + isPageFault);  // 车辆3被置换,算作缺页
        }
    }
    

    运行以上代码,可以看到输出结果为:

    Is page fault: false
    Is page fault: false
    Is page fault: false
    Is page fault: true
    Is page fault: true
    Is page fault: true
    

    其中表示true的行表示算作缺页,false的行表示不算作缺页。根据输入车辆的情况,可以看到当车辆1、2、3被置换时,不算作缺页;当车辆4、5、6被置换时,算作缺页。