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

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

实验3请求调页存储管理方式的模拟

1实验目的

通过对页面、页表、地址转换和页面置换过程的模拟,加深对请求调页系统的原理和实现过程的理解。

2实验内容

(1)假设每个页面中可存放10条指令,分配给一作业的内存块数为4。

(2)模拟一作业的执行过程。该作业共有320条指令,即它的地址空间为32页,目前它的所有页都还未调入内存。在模拟过程中,如果所访问的指令已经在内存中,则显示其物理地址,并转下一条指令。如果所访问的指令还未装入内存,则发生缺页,此时需记录缺页的次数,并将相应页调入内存。如果4个内存块中均已装入该作业,则需进行页面置换。最后显示其物理地址,并转下一条指令。在所有320条指令执行完毕后,请计算并显示作业运行过程中发生的缺页率。

(3)置换算法:请分别考虑OPT、FIFO和LRU算法。

(4)作业中指令的访问次序按下述原则生成:

•50%的指令是顺序执行的。

•25%的指令是均匀分布在前地址部分。

•25%的指令时均匀分布在后地址部分。

代码:

package mainDart;

import java.util.ArrayList;

import java.util.List;

import java.util.Random;

public class FIFO {

private static int times=0;//记录置换内存页面的次数

/**

* 随机产生0~319之间的数

* 产生320条指令

*

* @return 包含320条指令的数组

*/

public static int[] productNumber()

{

int order[] = new int[320];//数组存储的数字表示指令

Random rand = new Random();

for(int i=0;i<320;i++)

{

if(i%4==0)

{

order[i]=rand.nextInt(319); //0<=order<319

}

else if(i%4==1)

{

order[i]=order[i-1]+1;//1<=order<320

}

else if(i%4==2)

{

order[i]= rand.nextInt(order[i-1]);

}

else if(i%4==3)

{

order[i]=order[i-1]+rand.nextInt(320-order[i-1]);

}

}

return order;

}

/**

* 打印链表

* @param list

*/

public static void printList(List list)

{

for(int temt:list)

{

System.out.print(temt+"\t");

}

System.out.println();

}

/**

* 先进先出算法

* 总是淘汰最先进入内存的页面

* 在实现的时候,记录上一次所替换的页面在内存的下标,则本次要替换的位置就是上次下标+1的位置,并且下标是0~3循环的

* @param memoryNum

* @param page

*/

public static void FIFOChangePage(List memoryNum,int page)

{

int index = FIFOChangePage(memoryNum,page,++times);

memoryNum.remove(index);

memoryNum.add(index, page);

}

/**

* 返回本次替换的页面在内存中的位置

* @param memoryNum

* @param page

* @param times记录替换页面的次数,第一次替换的是内存第0个单元* @return

*/

public static int FIFOChangePage(List memoryNum,int page,int times) {

if(times==1)

{

return 0;

}

int index = (FIFOChangePage(memoryNum,page,times-1)+1)%4;

return index;

}

public static void main(String[] args) {

int[] order = productNumber();

System.out.println("320条随机指令数:");

for(int i =0;i

{

System.out.print(order[i]+"\t");

if((i+1)%10==0)

{

System.out.println();

}

}

List memoryNum= new ArrayList(4);//内存块存储的页面

int count=0;//记录缺页次数

for(int i=0;i<320;i++)

{

int page = order[i]/10;

if(memoryNum.contains(page)) //若该指令所在页面已经在内存,输出该页面所在内存块的号

{

}

else//没在内存,发生缺页,需要判断内存块是否存满,

{

if(memoryNum.size()<4) //内存没满,直接将所需页面调入内存

{

memoryNum.add(page);

}

else//内存存满,需要调用页面置换算法,进行页面置换

{

FIFOChangePage(memoryNum,page);//先进先出算法

}

count++;//记录缺页次数

}

printList(memoryNum);//打印内存所调入页面的情况

}

System.out.println("缺页率:"+(double)count/320);

}

}

package mainDart;

相关文档
最新文档