java请求调页存储管理方式的模拟_请求调页存储管理方式的模拟

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);

}

}

假设每个页面中可存放10条指令,分配给作业的内存块数为4。 用C语言语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需要进行页面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。 置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。 作业中指令的访问次序按下述原则生成: 50%的指令是顺序执行的; 25%的指令是均匀分布在前地址部分; 25%的指令是均匀分布在后地址部分; 具体的实施方法是:    在[0,319]的指令地址之间随机选取一起点m;    顺序执行下一条指令,即执行地址序号为m+1的指令;    通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;    顺序执行下一条指令,其地址序号为m1+1的指令;    通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;    顺序执行下一条指令,其地址序号为m2+1的指令; 重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。
二、 实验内容1. 假设每个页面中可存放10条指令,分配给作业的内存块数为4。2. 用C语言或C++语言模拟一个作业的执行过程,该作业共有320条指令, 即它的地址空间为32页,目前它的所有页都还未调入内存。再模拟过程中,如果所访问的指令已在内存,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需要记录缺页的次数,并将相应页调入内存。如果4个内存块均已装入该作业,则需要进行页面置换,最后显示其物理地址,并转向下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。3. 置换算法:请分别考虑最佳置换算法(OPT)、先进先出(FIFO)算法和最近最久未使用算法(LRU)。4. 作业中指令的访问次序按下述原则生成:50%的指令是顺序执行的;25%的指令是均匀分布在前地址部分;25%的指令是均匀分布在后地址部分;具体的实施方法是:(1):在[0,319]的指令地址之间随机选取一起点m;(2):顺序执行下一条指令,即执行地址序号为m+1的指令;(3):通过随机数,跳转到前地址部分[0,m+1]中的某条指令处,其序号为m1;(4):顺序执行下一条指令,其地址序号为m1+1的指令;(5):通过随机数,跳转到后地址部分[m1+2,319]中的某条指令处,其序号为m2;(6):顺序执行下一条指令,其地址序号为m2+1的指令;(7):重复跳转到前地址部分,顺序执行,跳转到后地址部分,顺序执行的过程直至执行320条指令。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值