模拟页面置换算法FIFOLRU的实现.docx
《模拟页面置换算法FIFOLRU的实现.docx》由会员分享,可在线阅读,更多相关《模拟页面置换算法FIFOLRU的实现.docx(11页珍藏版)》请在冰豆网上搜索。
![模拟页面置换算法FIFOLRU的实现.docx](https://file1.bdocx.com/fileroot1/2023-4/21/51243a34-eed7-4ed2-a809-db2631327aae/51243a34-eed7-4ed2-a809-db2631327aae1.gif)
模拟页面置换算法FIFOLRU的实现
实验报告五
实验名称:
模拟页面置换算法FIFO、LRU的实现
日期:
2015-12-9班级:
13级计科学号:
姓名:
一、实验目的
了解页面置换的概念,理解页面置换的算法加深对页面置换算法的理解。
二、实验内容
Java编程语言实现FIFO和LUR页面算法。
三、项目要求与分析
FIFO算法当需要置换页面时,主要通过置换最早进入内存的页面从而达到先进先出的目的。
LRU算法当需要置换页面时,主要通过置换进入内存中最久没有被访问的页面而达到最近最久未使用的目的。
程序中可以通过标志位进行记录。
四、具体实现
1.FIFO算法实现代码以及运行结果:
publicclassFIFO{
/**
*内存块的个数
*/
publicstaticintN;
/**
*内存块数组
*/
Object[]array=newObject[N];
/**
*要访问的页面数组
*/
publicstaticint[]visit;
privateintsize;
/**
*内存是非空为否
*@return
*/
publicbooleanisEmpty(){
if(0==size)
returntrue;
else
returnfalse;
}
/**
*内存是非空满
*@return
*/
publicbooleanisFulled(){
if(size>=N)
returntrue;
else
returnfalse;
}
/**
*元素(页框)的个数
*@return
*/
publicintsize(){
returnsize;
}
/**
*查找元素o在数组中的位置
*@paramo
*@return
*/
publicintindexOfElement(Objecto){
for(inti=0;iif(o==array[i]){
returni;
}
}
return-1;
}
/**
*页面转换
*@paramobj
*/
publicObjecttrans(Objectobj){
Objecte=null;
intt=0;
if(indexOfElement(obj)!
=-1){
t=indexOfElement(obj);
for(inti=t;iarray[i]=array[i+1];
}
array[size-1]=obj;
}else{
if(!
isFulled()){
array[size]=obj;
size++;
}else{
for(inti=0;iarray[i]=array[i+1];
}
array[size-1]=obj;
}
}
if(-1==t){
returnnull;
}else{
returnarray[t];
}
}
/**
*输出内存区中的各数据
*/
publicvoidshowMemoryBlock(){
for(inti=0;iSystem.out.print(array[i]+"");
}
}
/**
*清空队列(页框)
*/
publicvoidclear(){
}
/**
*@paramargs
*/
publicstaticvoidmain(String[]args){
Scannersc=newScanner(System.in);
System.out.print("请输入内存块的数量:
");
N=sc.nextInt();
System.out.print("请输入总页面数目:
");
intn=sc.nextInt();
visit=newint[n];
System.out.println("请输入各个页的页面号码:
");
for(inti=0;ivisit[i]=sc.nextInt();
FIFOfifo=newFIFO();
for(inti=0;ififo.trans(visit[i]);
fifo.showMemoryBlock();
System.out.println();
}
运行结果:
2.LUR算法实现代码以及运行结果:
publicclassLRU{
staticintvolum;//栈的容量
staticListlist=newLinkedList();
//链表用来模拟栈存放页面
staticint[]visit;//要访问的页面数组
staticintcount=0;//记录缺页次数
publicstaticvoidmain(String[]args)
{
Scannersc=newScanner(System.in);
System.out.print("请输入栈的容量:
");
volum=sc.nextInt();
System.out.print("请输入总页面数目:
");
intn=sc.nextInt();
visit=newint[n];
System.out.println("请输入各个页的页面号码:
");
for(inti=0;ivisit[i]=sc.nextInt();
sLRU();//调用最近最久未使用算法
System.out.println("置换页面的数目为:
"+count);
}
publicstaticvoidsLRU()
{
intindex=0;
while(index{
booleanflag=false;
if(list.size()<=volum)
{
for(inti=0;i{
if((int)(list.get(i))==visit[index])
{
list.remove(i);//先删除
list.add(visit[index]);//再添加到尾部
flag=true;
break;
}
}
if(!
flag)
{
if(list.size(){//如果栈未满,而且此页面没有在栈中,就将它入栈
list.add(visit[index]);
}
else
{//如果栈已经满了,且该页面号码没有在栈中,就把栈底元素删除,将新页插入
inttemp=list.get(0);
list.remove(0);//最开始一个换出
list.add(visit[index]);//加到末尾
count++;
System.out.println("开始换页了,将栈底的"+temp+"换出");
System.out.println("这也是没有办法的事情,毕竟栈是有限的");
}
}
System.out.print("经过第"+(index+1)+"个页面的栈内容为");
for(intk=0;kSystem.out.print(list.get(k)+"");
System.out.println();
index++;
}
运行结果:
五、所遇问题与解决方法
问题:
针对于FIFO算法定义选择在内存中驻留时间最久的页面予以淘汰,对于内存中的驻留时间理解复杂了不知道如何下手。
解决方案:
我们只需要设置一个先进先出队列就可以。
最先进入内存的页面最早被转换出去。
六、实验总结
1.通过本次实验,加深了对操作系统的页面置换有了一定的了解,并能够用高级语言进行模拟演示。
通过查阅相关资料基本掌握了JAVA应用程序编写的基本方法。
2.两种页面置换算法FIFO和LUR理解起来相当容易,但在实际编程实现的时候需要注意各种细节,需要耐心细致,实际编程过程中遇到一些细节性的问题确实需要仔细考虑才行。