packageyeReplace;importjava.io.BufferedReader;importjava.io.FileFilter;importjava.io.IOException;importjava.io.InputStreamReader;public classPageAPP {public static final int bSIZE = 4;static int pc; //程序计数器,用来记录指令的序号
static int n; //缺页计数器,用来记录缺页的次数
static int[] temp = new int[320]; //用来存放产生的320条随机数
staticBLOCK[] block;static int i; //FIFO中选择的物理块//初始化
public static voidinit() {
block= newBLOCK[bSIZE];
pc= n = 0;for (int i = 0; i < bSIZE; i++) {
BLOCK aa= new BLOCK(-1,0);
block[i]=aa;
}
}//查找物理块中是否有该页面
public static int findExits(intpage){for (int i = 0; i < bSIZE; i++) {if (block[i].pageNum ==page) {return i; //物理块中是否含有要调用的页curPage,如果有返回其位置i
}
}return -1;
}//查找空闲物理块
public static intfindSpace() {for (int i = 0; i < bSIZE; i++) {if (block[i].pageNum == -1) {return i; //存在空闲物理块的话就返回它的位置
}
}return -1;
}//选择应予置换的页面
public static intfindPage(){int position = 0;for (int i = 1; i < bSIZE; i++) {if (block[i].accessed > block[i-1].accessed){
position=i;
}
}returnposition;
}//显示
public static voiddisplay(){for (int i = 0; i < bSIZE; i++) {if (block[i].pageNum!=-1) {if (block[i].pageNum<10) {
System.out.print("0" + block[i].pageNum+ " ");
}else{
System.out.print(block[i].pageNum+ " ");
}
}
}
System.out.println("");
}//产生的320条随机数,可以重复
public static void suijishu() throwsIOException{int flag = 0;
pc= getInt(); //第一条数据是自己输入的
System.out.println("按照要求产生的随机数:");for (int i = 0; i < 320; i++) {
temp[i]=pc;int a = (int)(java.lang.Math.random()*320);if (flag%2==0) { //50%几率顺序执行
pc = ++pc%320;
}else if (flag == 1) { //25%几率向下执行
pc = a%(pc-1);
}else if (flag == 3) { //25%几率向上执行
pc = pc+1+(a%(320-(pc+1)));
}
flag= ++flag%4; //flag的取值为0、1、2、3
if (temp[i]<10) {
System.out.print("00"+ temp[i] + " ");
}else if (temp[i]<100) {
System.out.print("0" + temp[i] + " ");
}else{
System.out.print(temp[i]+ " ");
}if (i % 10 == 0) {
System.out.println("");
}
}
System.out.println("");
}//显示调用的页面队列
public static voidpageString(){for (int i = 0; i < 320; i++) {int a = temp[i]/10; //a代表页号,将temp中的指令转化为调用的页
if (a<10) {
System.out.print("0"+a+" ");
}else{
System.out.print(a+ " ");
}if ((i+1)%10 == 0) {
System.out.println("");
}
}
}//OPT算法
public static voidOPT(){intexist,position,space;intcurPage;for (int i = 0; i < 320; i++) {
pc=temp[i];
curPage= pc/10; //调用的页
exist =findExits(curPage);if (exist == -1) {
space=findSpace();if (space != -1) { //存在空的物理块
block[space].pageNum =curPage;
display();
n= n+1;
}else{//不存在空的物理块
for (int j = 0; j < bSIZE; j++) {for (int j2 = i; j2 < 320; j2++) {if (block[j].pageNum!=temp[j2]/10) {
BLOCK mm= new BLOCK(block[j].pageNum,1000);
block[j]=mm;
}else{
BLOCK mm= newBLOCK(block[j].pageNum,j2);
block[j]=mm;break;
}
}
}
position=findPage();
block[position]= new BLOCK(curPage, 0);
display();
n++;
}
}
}
System.out.println("缺页次数:" +n);int answer = (n * 100)/320;
System.out.println("缺页率:" + answer + "%");
}//FIFO的选择页方法
public static intfindBlock(){if (i
}else{
i=0;return i++;
}
}//FIFO
public static voidFIFO(){intexist,position,space;intcurPage;for (int i = 0; i < 320; i++) {
pc=temp[i];
curPage= pc/10;
exist=findExits(curPage);if (exist == -1) {
space=findSpace();if (space != -1) { //存在空的物理块
block[space].pageNum =curPage;
display();
n= n+1;
}else{//不存在空的物理块
position = findBlock(); //与RTO不同的地方
block[position] = new BLOCK(curPage, 0);
display();
n++;
}
}
}
System.out.println("缺页次数:" +n);int answer = (n * 100)/320;
System.out.println("缺页率:" + answer + "%");
}//主函数
public static void main(String[] args) throwsIOException{
init();
System.out.println("输入第一次执行的指令指令号(0~320):");
suijishu();while(true){
System.out.println("输入指令:");
System.out.println("1.显示对应的调用序列:");
System.out.println("2.退出");int choice =getInt();switch(choice){case 1:
System.out.println("对应的调用队列:");
pageString();
System.out.println("选择置换算法:");
System.out.println("1.最佳置换算法:");
System.out.println("2.先进先出算法:");int choice2 =getInt();switch(choice2) {case 1:
System.out.println("最佳置换算法:");
System.out.println("==============");
OPT();break;case 2:
System.out.println("先进先出算法:");
System.out.println("==============");
FIFO();break;case 3:
System.exit(0);break;default:break;
}break;case 2:
System.exit(0);break;
}
}
}//程序输入方法
public static String getString() throwsIOException{
InputStreamReader in= newInputStreamReader(System.in);
BufferedReader buff= newBufferedReader(in);
String s=buff.readLine();returns;
}public static int getInt() throwsIOException {
String s=getString();returnInteger.parseInt(s);
}
}