题目
操作系统中的虚拟内存管理系统可采用先进先出算法的方式缓存。
当请求的内存页不在缓存中。且缓存已满时,应从缓存中删除保存时间最长的页面,
从而为请求页面腾出空间,如果缓存未满,可直接将请求页面添加到缓存中,
给定的页面最多只应在缓存中出现一次。
构造FIFO类的构造方法为countCacheMiss。
该方法输入包括一个整数max_cache_size,和一个页面请求数组page_requests,
要求方法返回缓存未命中数的总数。
思考
可以为每个页面设置一个变量来记录在缓存中的时长,题目又要求页面不重复,
考虑用HashMap的键值对处理,key表示缓存中页面编号,value表示时长。
对于每一个页面请求,先判断是不是存在于缓存,
若存在是则将缓存内所有页面时长+1;
否则,
若缓存
若达到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 pages = new HashMap();
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 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 entry1 : pages.entrySet()) {