題目
操作系統中的虛擬內存管理系統可采用先進先出算法的方式緩存。
當請求的內存頁不在緩存中。且緩存已滿時,應從緩存中刪除保存時間最長的頁面,
從而為請求頁面騰出空間,如果緩存未滿,可直接將請求頁面添加到緩存中,
給定的頁面最多只應在緩存中出現一次。
構造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