一、实现思路
实验报告5-页面调度
1、关于页面调度
页式虚拟存储器实现的一个难点是设计页面调度(置换)算法,即将新页面调入内存时,如果内存中所有的物理页都已经分配出去,就要按某种策略来废弃某个页面,将其所占据的物理页释放出来,供新页面使用。
2、衡量指标
衡量页面调度性能的指标有:缺页调度次数和缺页中断率、缺页置换率。缺页中断次数是缺页时发出缺页中断的次数;缺页中断率是缺页中断次数/总的页面引用次数100%;缺页调度次数是调入新页时需要进行页面调度的次数;缺页置换率=缺页调度次数/总的页面引用次数*100%。
3、LRU淘汰最近最少调度算法
先进先出调度算法没有考虑页面的使用情况,大多数情况下性能不佳。根据程序执行的局部性特点,程序一旦访问了某些代码和数据,则在一段时间内会经常访问他们,因此最近最少用调度在选择淘汰页面时会考虑页面最近的使用,总是选择在最近一段时间以来最少使用的页面予以淘汰。算法实现时需要为每个页面设置数据结构记录页面自上次访问以来所经历的时间。
二、实验步骤
1、PageSchedule类
public class PageSchedule {
//页框数
private Integer pageNum;
//页面访问列表
private List<Integer> pageList;
//定义容器
List<Integer> container = new LinkedList<>();
//定义缺页率
Integer pageMiss = 0;
//构造函数,初始化页框数和页面访问列表
public PageSchedule(Integer pageNum, List<Integer> pageList) {
this.pageNum = pageNum;
this.pageList = pageList;
}
//LRU淘汰最近最少使用页面的算法
public void LRU(){
System.out.println("LRU淘汰最近最少使用页面的算法");
//遍历页面访问列表
for (int i = 0; i < pageList.size(); i++) {
//获取当前页
Integer page = pageList.get(i);
System.out.println("第"+ (i+1) +"次请求");
System.out.print("\t请求前");
//输出容器
showContainer();
System.out.print("\t请求的页面是:"+page+",");
//缺页
if (!container.contains(page)){
//容器已满
if (container.size() >= pageNum){
container.remove(0);
}
//将外存页面调入内存
container.add(page);
pageMiss++;
System.out.println("缺页");
}
//命中
else {
container.remove(page);
container.add(page);
System.out.println("命中");
}
//输出容器
System.out.print("\t请求后");
showContainer();
}
//计算并格式化输出缺页率
System.out.println(String.format("页框数为:%d,缺页中断次数为:%d,请页总次数为:%d,缺页率为:%.2f%%",
pageNum,pageMiss,pageList.size(),100*pageMiss / (pageList.size() * 1.0)));
}
//格式化输出容器
private void showContainer() {
System.out.print("容器:");
for (Integer page:container) {
System.out.print(page + " ");
}
System.out.println();
}
}
2、Test测试类
public class Test {
public static void main(String[] args) {
//给定的初始参数
int pageNum = 3;
String pageListStr = "7,0,1,2,0,3,0,4,1,6,2,5,3";
//将字符串转换为List
List<Integer> pageList = new ArrayList<>();
String[] strings = pageListStr.split(",");
for (String str:strings) {
pageList.add(Integer.parseInt(str));
}
//实例化页面调度类
PageSchedule pageSchedule = new PageSchedule(pageNum,pageList);
//调用LRU淘汰最近最少使用页面的算法
pageSchedule.LRU();
}
}