请求页式存储管理实验
一、 实验目的:
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。
二、 实验要求:
设计一个请求页式存储管理方案。并编写模拟程序实现。
(1)产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列。
(2)简单起见,页面淘汰算法采用LRU页面淘汰算法,并且在淘汰一页时,只将该页在页表中抹去。而不再判断它是否被改写过,也不将它写回到辅存。
具体的做法可以是:
(1)产生一个需要访问的指令地址流,如 1059B,1060B,3059B,4753B,2241B…………;
(2)指令合适的页面尺寸(例如以 1KB或2KB为1页);
(3)指定内存页表的最大长度,并对页表进行初始化;
(4)每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;如果该页不在主存且页表未满,则调入一页并打印页表情况;如果该页不在主存且页表已满,则按LRU页面淘汰算法淘汰一页后调入所需的页,打印页表情况;
(5)逐个地址访问,直到所有地址转换/访问完毕。
import java.util.LinkedList;
public class LRU {
private LinkedList<Integer> stack;//模拟页面'寄存器'
private int size;//寄存器大小,表示一共可装入多少页面
public LRU(int size) {
stack = new LinkedList<>();
this.size = size;
}
//LRU算法简单实现,返回一共未命中的次数
public int lru(int[] pageNumbers)
{
if(size <= 0 || pageNumbers == null)
throw new IllegalArgumentException("illegal arugments");
if(pageNumbers.length <= size)
return pageNumbers.length;
int unhit = 0;
for(int i = 0; i < pageNumbers.length; i++)
{
int index = isHit(pageNumbers[i]);
if(index == -1)
{
unhit = processUnHit(pageNumbers[i], unhit);
System.out.println(" "+pageNumbers[i]+" "+"缺页");
}
else
{
ifHit(pageNumbers[i], index);
System.out.println(" "+pageNumbers[i]+" "+"命中");
}
}
return unhit;
}
/**
*
* @param pageNumber 判断 pageNumber是否hit
* @return -1 表示 unhit, 其他表示hit
*/
private int isHit(int pageNumber){
return stack.indexOf(pageNumber);
}
/**
* 当栈未满时,未命中的页面号直接入栈;栈满时,需要替换页面,先选中一个页面(栈底)删除,然后Push新页面
* @param pageNumber 未命中的页面号
* @param count 当前未命中次数
* @return 更新后的未命中的次数
*/
private int processUnHit(int pageNumber, int count){
if(isFull())
stack.removeLast();//删除最久未访问的页面
stack.push(pageNumber);//放入最近访问的页面
count++;//未命中的次数加1
return count;
}
//命中更换
private void ifHit(int pageNumber, int index){
stack.push(stack.remove(index));
}
//判断'寄存器'栈是否已经满了
private boolean isFull()
{
if(stack.size() < size)
return false;
else
return true;
}
//test
public static void main(String[] args) {
int[] pageNumbers = {4,7,1,1,7,2,4,5,7,1,8};
int size = 3;
for(int i = 0; i < pageNumbers.length; i++)
System.out.print(" "+pageNumbers[i]+" ");
System.out.println();
LRU lru = new LRU(size);
System.out.println("缺页率:"+lru.lru(pageNumbers)+"/"+pageNumbers.length);
}
}