如需源码请参见文章末尾链接(包含OPT,FIFO,LRU内存管理算法)
【设计目的】
掌握物理内存和虚拟内存的基本概念;
掌握重定位的基本概念及其要点,理解逻辑地址与绝对地址;
掌握各种存储管理的实现方法,包括基本原理、地址变换和缺页中断、主存空间的分配及分配算法;掌握常用淘汰算法。
【设计内容】
编写模拟的动态页式存储管理程序,实现对动态页式存储的淘汰算法的模拟(包括先进先出淘汰算法、最近最少使用淘汰算法、最不经常使用淘汰算法三种算法均进行模拟)并计算各个算法的缺页率;并且页面淘汰算法在淘汰一页时,只将该页在页表中抹去,而不再判断它是否被改写过,也不将它写回到辅存。
【设计步骤】
以OPT算法为例说明动态页式存储管理的实现过程:
1.指定内存页表的最大长度,并对页表进行初始化;
2.每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不足主存且页表已满,则按OPT页面淘汰算法淘汰一页后调入所需的页,打印页表情况; 逐个地址访问,直到所有地址访问完毕。
3.OPT存储管理算法的流程图如下图所示:
- 根据图4编写并运行程序,给出程序运行界面。(篇幅有限,仅展示模拟OPT算法)
主要代码:
/**
* READ:主要写的是OPT,FIFO算法自不必说,简单
* 而LRU也是根据OPT小改而来,仅向前倒序排列得到淘汰序列
* OPT注释较全为保留所有思考的痕迹,而LRU全部精简
*
* !!!!主要看OPT!!!!
*/
static void OPT(int []pageSequence){
// int OUT[] = new int[pageSequence.length-PageFrame.length]; List<Integer> OUT = new ArrayList<>();
List<Integer> listOut = new ArrayList<>();
int OutPage;
while (true){
// !asList(PageFrame).contains(PageSequence[Request])) //
if (PageFrame.size() != PageFrameSize&&!PageFrame.contains(PageSequence[Request])){ X80++;
PageFrame.add(list.get(Request)); //调页
Request++; //处理下次请求
for (int e : //测试输出
PageFrame) {
System.out.println(e);
}
System.out.println("---------------");
if (Request - 1 == pageSequence.length)
break;
} else if (PageFrame.size() == PageFrameSize&&!PageFrame.contains(PageSequence[Request])){
for (int i = Request + 1; i <= list.size() - 1; i++) {
listOut.add(list.get(i));
}
for (int e = Request + 1, i = 0; e <= pageSequence.length && i < PageFrame.size(); e++, i++) { //!!!!重要 用Request+1后续进行遍历 (此处当页框遍历完时或当访问序列遍历完时才会停止,此处要保证页框必须大于访问序列)
OUT.add(listOut.indexOf(PageFrame.get(i)));
}
// OUT.indexOf(-1);
// Collections.max(OUT);
// OUT.indexOf(Collections.max(OUT));
if (OUT.contains(-1)) { //有以后不会访问元素时
OutPage = OUT.indexOf(-1);
} else { //没有则找第一次访问索引最大项
OutPage = OUT.indexOf(Collections.max(OUT));
}
X80++;
System.out.println("第" + Request + "页到来时淘汰的是: " + OutPage);
PageFrame.set(OutPage, list.get(Request)); //调页
for (int e : //测试输出
PageFrame) {
System.out.println(e);
}
System.out.println("---------------");
Request++; //处理下次请求
if (Request == PageSequence.length)
break;
OUT.clear();
//Arrays.fill(OUT,0); //同下
listOut.clear(); //清除所有,避免新new,节约空间
}else { //页框内页面请求调入,请求指针后移
Request++;
if (Request == PageSequence.length) {
break;
}
}
}
}
访问页面:7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1
预期结果
运行结果
实现源码资源链接: