zoukankan      html  css  js  c++  java
  • 先进先出缓存算法(FIFO)--java实现

    题目
    操作系统中的虚拟内存管理系统可采用先进先出算法的方式缓存。

    当请求的内存页不在缓存中。且缓存已满时,应从缓存中删除保存时间最长的页面,
    从而为请求页面腾出空间,如果缓存未满,可直接将请求页面添加到缓存中,
    给定的页面最多只应在缓存中出现一次。

    构造FIFO类的构造方法为countCacheMiss。
    该方法输入包括一个整数max_cache_size,和一个页面请求数组page_requests,
    要求方法返回缓存未命中数的总数。

    思考
    可以为每个页面设置一个变量来记录在缓存中的时长,题目又要求页面不重复,
    考虑用HashMap的键值对处理,key表示缓存中页面编号,value表示时长。

    对于每一个页面请求,先判断是不是存在于缓存,
    若存在是则将缓存内所有页面时长+1;
    否则,

    若缓存<max_cache_size时添加当前请求页面至缓存,

    若达到max_cache_size则从缓存中去掉时长最大的那个,再添加当前请求页面至缓存。

    代码
    import java.util.HashMap;
    import java.util.Map.Entry;
     
    public class FIFOCache {
     
        public static int FIFO(int maxize, int[] page_req) {
            int count = 0;
            HashMap<Integer, Integer> pages = new HashMap<Integer, Integer>();
            for (int j = 0; j < page_req.length; j++) {
                if (pages.containsKey(Integer.valueOf(page_req[j]))) {
                    System.out.println(Integer.valueOf(page_req[j]) + "命中缓存!");
                    // 若pages列表中有当前请求页面,就把列表时间加1;
                    for (Entry<Integer, Integer> entry : pages.entrySet()) {
                        Integer value = entry.getValue();
                        entry.setValue(Integer.valueOf(value.intValue() + 1));
                        System.out.print(entry.getKey() + " 当前的保存时间:" + entry.getValue() + " ");
                    }
                    System.out.println();
                    continue;
                } else {
                    System.out.println(Integer.valueOf(page_req[j]) + "未命中缓存!");
                    // 如果缓存满了,则去除缓存中存在最久的页面
                    if (pages.size() == maxize) {
                        int max = 0;
                        int key = 0;
                        for (Entry<Integer, Integer> entry1 : pages.entrySet()) {
                            // 求出缓存中存在最久的页面
                            if (entry1.getValue().intValue() > max) {
                                max = entry1.getValue().intValue();
                                key = entry1.getKey().intValue();
                            }
                        }
                        // 移除页面
                        pages.remove(key);
                        System.out.println(key + "被移除!");
                    }
                    // 就把当前缓存列表中页面的时间加1;
                    for (Entry<Integer, Integer> entry : pages.entrySet()) {
                        Integer value = entry.getValue();
                        entry.setValue(Integer.valueOf(value.intValue() + 1));
                    }
                    // 将新的请求页面加入缓存列表中并将其请求次数设置为0
                    System.out.println(Integer.valueOf(page_req[j]) + "存入缓存!");
                    pages.put(Integer.valueOf(page_req[j]), Integer.valueOf(0));
                    // 统计缺页次数
                    count++;
                    System.out.println("当前未命中次数为:" + count);
                }
                // // 输出当前的缓存信息
                System.out.println("当前的缓存信息为:");
                for (Entry<Integer, Integer> entry : pages.entrySet()) {
                    Integer value = entry.getValue();
                    Integer key = entry.getKey();
                    System.out.print(key + " 在缓存中,保存时间:" + value + " ");
                }
                System.out.println();
            }
            return count;
        }
     
        public static void main(String[] args) {
            // test 1
            int maxsize = 2;
            int[] page_reg1 = { 1, 2, 1, 3, 1, 2 };
            int count = FIFO(maxsize, page_reg1);
            System.out.println("未命中总数为:" + count);
            System.out.println("——————————————————————————————————");
            // test 2
            maxsize = 3;
            int[] page_reg2 = { 7, 1, 2, 0, 3, 0, 4, 2, 3, 0, 3, 2, 1, 2, 0 };
            count = FIFO(maxsize, page_reg2);
            System.out.println("未命中总数为:" + count);
            System.out.println("——————————————————————————————————");
            // test 3
            maxsize = 2;
            int[] page_reg3 = { 2, 3, 1, 3, 2, 1, 4, 3, 2 };
            count = FIFO(maxsize, page_reg3);
            System.out.println("未命中总数为:" + count);
            System.out.println("——————————————————————————————————");
        }
     
    }


    输出

    //1未命中缓存!
    //1存入缓存!
    //当前未命中次数为:1
    //当前的缓存信息为:
    //1 在缓存中,保存时间:0    
    //2未命中缓存!
    //2存入缓存!
    //当前未命中次数为:2
    //当前的缓存信息为:
    //1 在缓存中,保存时间:1    2 在缓存中,保存时间:0    
    //1命中缓存!
    //1 当前的保存时间:2    2 当前的保存时间:1    
    //3未命中缓存!
    //1被移除!
    //3存入缓存!
    //当前未命中次数为:3
    //当前的缓存信息为:
    //2 在缓存中,保存时间:2    3 在缓存中,保存时间:0    
    //1未命中缓存!
    //2被移除!
    //1存入缓存!
    //当前未命中次数为:4
    //当前的缓存信息为:
    //1 在缓存中,保存时间:0    3 在缓存中,保存时间:1    
    //2未命中缓存!
    //3被移除!
    //2存入缓存!
    //当前未命中次数为:5
    //当前的缓存信息为:
    //1 在缓存中,保存时间:1    2 在缓存中,保存时间:0    
    //未命中总数为:5
    //——————————————————————————————————
    //7未命中缓存!
    //7存入缓存!
    //当前未命中次数为:1
    //当前的缓存信息为:
    //7 在缓存中,保存时间:0    
    //1未命中缓存!
    //1存入缓存!
    //当前未命中次数为:2
    //当前的缓存信息为:
    //1 在缓存中,保存时间:0    7 在缓存中,保存时间:1    
    //2未命中缓存!
    //2存入缓存!
    //当前未命中次数为:3
    //当前的缓存信息为:
    //1 在缓存中,保存时间:1    2 在缓存中,保存时间:0    7 在缓存中,保存时间:2    
    //0未命中缓存!
    //7被移除!
    //0存入缓存!
    //当前未命中次数为:4
    //当前的缓存信息为:
    //0 在缓存中,保存时间:0    1 在缓存中,保存时间:2    2 在缓存中,保存时间:1    
    //3未命中缓存!
    //1被移除!
    //3存入缓存!
    //当前未命中次数为:5
    //当前的缓存信息为:
    //0 在缓存中,保存时间:1    2 在缓存中,保存时间:2    3 在缓存中,保存时间:0    
    //0命中缓存!
    //0 当前的保存时间:2    2 当前的保存时间:3    3 当前的保存时间:1    
    //4未命中缓存!
    //2被移除!
    //4存入缓存!
    //当前未命中次数为:6
    //当前的缓存信息为:
    //0 在缓存中,保存时间:3    3 在缓存中,保存时间:2    4 在缓存中,保存时间:0    
    //2未命中缓存!
    //0被移除!
    //2存入缓存!
    //当前未命中次数为:7
    //当前的缓存信息为:
    //2 在缓存中,保存时间:0    3 在缓存中,保存时间:3    4 在缓存中,保存时间:1    
    //3命中缓存!
    //2 当前的保存时间:1    3 当前的保存时间:4    4 当前的保存时间:2    
    //0未命中缓存!
    //3被移除!
    //0存入缓存!
    //当前未命中次数为:8
    //当前的缓存信息为:
    //0 在缓存中,保存时间:0    2 在缓存中,保存时间:2    4 在缓存中,保存时间:3    
    //3未命中缓存!
    //4被移除!
    //3存入缓存!
    //当前未命中次数为:9
    //当前的缓存信息为:
    //0 在缓存中,保存时间:1    2 在缓存中,保存时间:3    3 在缓存中,保存时间:0    
    //2命中缓存!
    //0 当前的保存时间:2    2 当前的保存时间:4    3 当前的保存时间:1    
    //1未命中缓存!
    //2被移除!
    //1存入缓存!
    //当前未命中次数为:10
    //当前的缓存信息为:
    //0 在缓存中,保存时间:3    1 在缓存中,保存时间:0    3 在缓存中,保存时间:2    
    //2未命中缓存!
    //0被移除!
    //2存入缓存!
    //当前未命中次数为:11
    //当前的缓存信息为:
    //1 在缓存中,保存时间:1    2 在缓存中,保存时间:0    3 在缓存中,保存时间:3    
    //0未命中缓存!
    //3被移除!
    //0存入缓存!
    //当前未命中次数为:12
    //当前的缓存信息为:
    //0 在缓存中,保存时间:0    1 在缓存中,保存时间:2    2 在缓存中,保存时间:1    
    //未命中总数为:12
    //——————————————————————————————————
    //2未命中缓存!
    //2存入缓存!
    //当前未命中次数为:1
    //当前的缓存信息为:
    //2 在缓存中,保存时间:0    
    //3未命中缓存!
    //3存入缓存!
    //当前未命中次数为:2
    //当前的缓存信息为:
    //2 在缓存中,保存时间:1    3 在缓存中,保存时间:0    
    //1未命中缓存!
    //2被移除!
    //1存入缓存!
    //当前未命中次数为:3
    //当前的缓存信息为:
    //1 在缓存中,保存时间:0    3 在缓存中,保存时间:1    
    //3命中缓存!
    //1 当前的保存时间:1    3 当前的保存时间:2    
    //2未命中缓存!
    //3被移除!
    //2存入缓存!
    //当前未命中次数为:4
    //当前的缓存信息为:
    //1 在缓存中,保存时间:2    2 在缓存中,保存时间:0    
    //1命中缓存!
    //1 当前的保存时间:3    2 当前的保存时间:1    
    //4未命中缓存!
    //1被移除!
    //4存入缓存!
    //当前未命中次数为:5
    //当前的缓存信息为:
    //2 在缓存中,保存时间:2    4 在缓存中,保存时间:0    
    //3未命中缓存!
    //2被移除!
    //3存入缓存!
    //当前未命中次数为:6
    //当前的缓存信息为:
    //3 在缓存中,保存时间:0    4 在缓存中,保存时间:1    
    //2未命中缓存!
    //4被移除!
    //2存入缓存!
    //当前未命中次数为:7
    //当前的缓存信息为:
    //2 在缓存中,保存时间:0    3 在缓存中,保存时间:1    
    //未命中总数为:7


  • 相关阅读:
    String类之indexOf--->查找某字对应的位置
    5、文件过滤器
    String类之endsWith方法--->检测该字符串以xx为结尾
    for循环
    java-成员方法/变量、类方法/变量等区别
    4、File类之获取方法
    3、File类之创建、删除、重命名、判断方法
    2、创建File类对象
    Java 实现Redis客户端,服务端
    Phoenix踩坑填坑记录
  • 原文地址:https://www.cnblogs.com/zhuyeshen/p/12200917.html
Copyright © 2011-2022 走看看