一、实验目的
通过编写和调试存储管理的模拟程序以加深对存储管理方案的理解。熟悉虚存管理的各种页面淘汰算法。通过编写和调试地址转换过程的模拟程序以加强对地址转换过程的了解。深入了解页式存储管理如何实现地址转换;进一步认识页式虚拟存储管理中如何处理缺页中断以及页面置换算法。
二、实验内容
设计一个请求页式存储管理方案。并编写模拟程序实现之。产生一个需要访问的指令地址流。它是一系列需要访问的指令的地址。为不失一般性,你可以适当地(用人工指定地方法或用随机数产生器)生成这个序列, 为简单起见。页面淘汰算法采用 FIFO页面淘汰或LRU算法,并且在淘汰一页时,只将该页在页表中标志位进行修改。而不再判断它是否被改写过,也不将它写回到辅存。
具体的做法可以是:
(1)产生一个需要访问的指令地址流或按下表2中的指令地址流。
(2)指定合适的页面尺寸(例如以 1K为1页);
(3)指定内存页表的最大长度,并对页表进行初始化; 下表1
每访问一个地址时,首先要计算该地址所在的页的页号,然后查页表,判断该页是否在主存——如果该页已在主存,则打印页表情况;同时输出绝对地址。如果该页不在主存且页表已满,则按 FIFO页面淘汰算法淘汰一页后调入所需的页(只将该页在页表中标志位进行修改),打印页表情况;逐个地址访问,直到所有地址访问完毕。
存储管理算法的流程图如下:
假定主存的每个主存块1024字节,系统中每个作业分得主存块4块。
页表如下:
页号 标志 主存块号 修改标志 磁盘位置
0 1 5 0 011
1 1 8 0 012
2 1 9 0 013
3 1 1 0 021
4 0 0 022
5 0 0 023
6 0 0 121
指令流如下:
操作 页号 页内地址 操作 页号 页内地址
- 0 070 移位 4 053
- 1 050 + 5 023
- 2 015 存 1 037
存 3 021 取 2 078
取 0 056 + 4 001
- 6 040 存 6 084
依次执行上述指令序列来调试你的程序。仅模拟指令的执行,不考虑指令序列中具体操作的执行。
三、实验环境
软件:eclipse
win10
四、实验步骤
import java.util.Scanner;
class Yetable{
public int yeno;
public int logo;
public int kuaino;
public int xiugai;
public String home;
public Yetable(int yeno, int logo, int kuaino, int xiugai,
String home) {
super();
this.yeno = yeno;
this.logo = logo;
this.kuaino = kuaino;
this.xiugai = xiugai;
this.home = home;
}
public Yetable(int yeno, int logo, int xiugai,
String home) {
super();
this.yeno = yeno;
this.logo = logo;
this.xiugai = xiugai;
this.home = home;
}
}
public class Mainclass {
public static void main(String[] args) {
Yetable[] table = new Yetable[7];
table[0]=new Yetable(0,1,5,0,"011");
table[1]=new Yetable(1,1,8,0,"012");
table[2]=new Yetable(2,1,9,0,"013");
table[3]=new Yetable(3,1,1,0,"021");
table[4]=new Yetable(4,0,0,"022");
table[5]=new Yetable(5,0,0,"023");
table[6]=new Yetable(6,0,0,"121");
int[] tihuan = new int[]{0,1,2,3};
int yeno;
Scanner scan = new Scanner(System.in);
int dizhi;
int jueduidizhi;
int flag=0;
int a=0;
System.out.println("页号 "+"标志 "+"主存块号"+"修改标志"+"磁盘位置");
for(int j=0;j<table.length;j++){
System.out.println(table[j].yeno+" "+table[j].logo+" "+table[j].kuaino+" "+table[j].xiugai+" "+table[j].home);
}
while(true){
System.out.println("请输入要访问的页号:");
yeno = scan.nextInt();
System.out.println("请输入页号的页内地址:");
dizhi =scan.nextInt();
for(int i=0;i<table.length;i++){
if(yeno==table[i].yeno){
a++;
if(table[i].logo==1){
System.out.println("页号 "+"标志 "+"主存块号"+"修改标志"+"磁盘位置");
for(int j=0;j<table.length;j++){
System.out.println(table[j].yeno+" "+table[j].logo+" "+table[j].kuaino+" "+table[j].xiugai+" "+table[j].home);
}
jueduidizhi=table[i].kuaino*1024+dizhi;
System.out.println("绝对地址:"+jueduidizhi);
break;
}else{
if(flag==4){
flag=1;
}
table[i].logo=1;
int m=tihuan[flag];
table[m].logo=0;
table[i].kuaino=table[m].kuaino;
table[m].kuaino=0;
tihuan[flag]=table[i].yeno;
flag++;
System.out.println("页号 "+"标志 "+"主存块号"+"修改标志"+"磁盘位置");
for(int j=0;j<table.length;j++){
System.out.println(table[j].yeno+" "+table[j].logo+" "+table[j].kuaino+" "+table[j].xiugai+" "+table[j].home);
}
break;
}
}
}
if(a==0){
System.out.println("无此页号!");
continue;
}
}
}
}
五、实验结果与讨论
下面结果略