先進先出緩存算法(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() + "\t");
                }
                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 + "\t");
            }
            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



免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM