页面置换算法先进先出java_页面替换算法(FCFS,LRU,OPT三种)

import java.util.Scanner;

import java.util.Arrays;

import java.util.LinkedList;

class PageReplacementAlgorithm

{

PageReplacementAlgorithm(){}

public void FIFO(int  PageOrder[],int block[])

{

//先进先出算法

/*

*最开始,先把物理块放满

*在物理块放满之后,对物理块进行判断,判断当前页面是否在物理快中,在则不用置换,不在则从当前页面向序列前寻找,找到最先开始在物理块中出现的页面(即最小数组下标)

*找到后,将其替换掉(替换的同时计置换的次数),进行下一轮判断

* */

int [][]LackPageIndex=new int [PageOrder.length][2];//保存每一次缺页索引以及插入的页面

int [][]PagePrint=new int [PageOrder.length] []; //保存每一次缺页记录

int []blockCopy=new int [block.length];

int LackPage=0; //缺页数

boolean existence; //用来标记页面是否存在于物理块中

for(int i=0;i

{

//开放内存空间

PagePrint[i]=new int [block.length];

}

for(int i=0;i

{

//开放内存空间

LackPageIndex[i]=new int [2];

}

for(int currentPosition=0;currentPosition

{

existence=false;

for(int j=0;j

{

if(block[j]==PageOrder[currentPosition])

{

//当前页面存在物理块中

existence=true;

break;

}

else  continue;

}

if(existence)

{

continue;

}

if(!existence)

{

//当前页面不存在物理块中:1.物理块没满,直接加入;2.物理快满了,从当前位置向前找,筛选出最先开始在物理块中出现的页面

if(BlockIsFull(block))

{

//物理块满了

int firstIn=FindFirstIn(block,currentPosition,LackPageIndex);//找出最开始在物理快中出现的页面下标

int pagePosition=ReplacePage(block,PageOrder[firstIn]);//页面在物理块中的位置

block[pagePosition]=PageOrder[currentPosition];  //用当前页面替换旧的页面

blockCopy=Arrays.copyOf(block, block.length);//拷贝当前缺页数组

PagePrint[currentPosition]=blockCopy; //保存次缺页记录,后续打印

LackPageIndex[currentPosition][0]=currentPosition;//0下标保存每一次缺页索引

LackPageIndex[currentPosition][1]=PageOrder[currentPosition];//1下标保存插入的页面

LackPage++;//缺页数++

continue;

}

else

{

//物理块没满

for(int k=0;k

{

if(block[k]==-1)

{

block[k]=PageOrder[currentPosition];//将页面放入物理块中

blockCopy=Arrays.copyOf(block, block.length); //拷贝当前缺页数组

PagePrint[currentPosition]=blockCopy; //保存第(i+1)次缺页记录,后续打印

LackPageIndex[currentPosition][0]=currentPosition;//0下标保存每一次缺页索引

LackPageIndex[currentPosition][1]=PageOrder[currentPosition];//1下标保存插入的页面

LackPage++;//缺页数++

break;//下一个页面

}

}

}

}

}

double LackPagePercent=((double)LackPage/(double)PageOrder.length);

System.out.println("FIFO算法缺页率,缺页次数,缺页情况如下");

System.out.println("缺页率为"+LackPagePercent*100+"%"+" ;"+"缺页次数为"+LackPage);

Print(PageOrder,PagePrint);

}

public int ReplacePage(int block[] ,int page)

{

//找到页面在物理块中相应的位置并返回

int i;

for( i=0;i

{

if(block[i]==page)

{

return i;

}

}

System.out.println("该页面在物理块中不存在:返回-1");

return -1;

}

public  int FindFirstIn(int block[],int currentPosition,int[][]LackPageIndex)

{

//找到这三个页面出现的三个最小下标

//从当前位置向前找,找到在物理块中最早出现的页面,返回最早出现在物理快中页面的索引

LinkedList List=new LinkedList();

A:for(;currentPosition>=0;currentPosition--)

{

for(int i=0;i

{

//从当前位置向前寻找,找到了

if(block[i]==LackPageIndex[currentPosition][1]&&(LackPageIndex[currentPosition][0]!=0|| LackPageIndex[currentPosition][1]!=0))

{

//找到了第i个页面出现的位置

List.add(LackPageIndex[currentPosition][0]); //保存最小索引

if(List.size()==block.length)

break A;

}

else continue;//没找到则继续往前

}

}

Integer [] saveIndex=new Integer[List.size()];

List.toArray(saveIndex);

int FirstInIndex=100;

for(int j=0;j

{

if(saveIndex[j]

{

//找到最早出现的下标

FirstInIndex=saveIndex[j];

}

}

return FirstInIndex;//返回最早出现页面的下标

}

public  int FindFirstIn(int block[],int currentPosition,int[]PageOrder)

{

//找到这三个页面出现的三个最小下标

//从当前位置向前找,找到在物理块中最早出现的页面,返回最早出现在物理快中页面的索引

LinkedList List=new LinkedList();

LinkedList Page=new LinkedList();

A:for(;currentPosition>=0;currentPosition--)

{

for(int i=0;i

{

//从当前位置向前寻找,找到了

if(block[i]==PageOrder[currentPosition])

{

//找到了第i个页面出现的位置

if(!Page.contains(PageOrder[currentPosition]))

{

Page.add(PageOrder[currentPosition]);//保存页面

List.add(currentPosition); //保存最大索引

}

if(List.size()==block.length)

break A;

}

else continue;//没找到则继续往前

}

}

Integer [] saveIndex=new Integer[List.size()];

List.toArray(saveIndex);

int FirstInIndex=100;

for(int j=0;j

{

if(saveIndex[j]

{

//找到最早出现的下标

FirstInIndex=saveIndex[j];

}

}

return FirstInIndex;//返回最早出现页面的下标

}

public boolean BlockIsFull(int block[])

{

//判断物理块是否满了,满则返回true,不满则返回false

for(int i=0;i

{

if(block[i]==-1)

return false;

else continue;

}

return true;

}

public void OPI(int  PageOrder[],int block[])

{

//最佳置换算法

/*

* 最开始,先把物理块放满

* 在物理块放满之后,对物理块进行判断,判断当前页面是否在物理块中,在则不用置换,不在则从当前页面向后寻找,找到最后出现在物理块中的页面(即最大数组下标)

* 找到后,将其替换掉(替换的同时计置换的次数),进行下一轮判断

* */

int [][]LackPageIndex=new int [PageOrder.length][2];//保存每一次缺页索引以及插入的页面

int [][]PagePrint=new int [PageOrder.length] []; //保存每一次缺页记录

int []blockCopy=new int [block.length];

int LackPage=0; //缺页数

boolean existence; //用来标记页面是否存在于物理块中

for(int i=0;i

{

//开放内存空间

PagePrint[i]=new int [block.length];

}

for(int i=0;i

{

//开放内存空间

LackPageIndex[i]=new int [2];

}

for(int currentPosition=0;currentPosition

{

existence=false;

for(int j=0;j

{

if(block[j]==PageOrder[currentPosition])

{

//当前页面存在物理块中

existence=true;

break ;

}

else  continue;

}

if(existence)

{

continue;

}

if(!existence)

{

//当前页面不存在物理块中:1.物理块没满,直接加入;2.物理快满了,从当前位置向前找,筛选出最先开始在物理块中出现的页面

if(BlockIsFull(block))

{

//物理块满了

int firstIn=FindLastIn(block,currentPosition,PageOrder);//找出最迟在物理快中出现的页面下标

int pagePosition=ReplacePage(block,PageOrder[firstIn]);//页面在物理块中的位置

block[pagePosition]=PageOrder[currentPosition];  //用当前页面替换旧的页面

blockCopy=Arrays.copyOf(block, block.length);//拷贝当前缺页数组

PagePrint[currentPosition]=blockCopy; //保存次缺页记录,后续打印

LackPageIndex[currentPosition][0]=currentPosition;//0下标保存每一次缺页索引

LackPageIndex[currentPosition][1]=PageOrder[currentPosition];//1下标保存插入的页面

LackPage++;//缺页数++

continue;

}

else

{

//物理块没满

for(int k=0;k

{

if(block[k]==-1)

{

block[k]=PageOrder[currentPosition];//将页面放入物理块中

blockCopy=Arrays.copyOf(block, block.length);//拷贝当前缺页数组

PagePrint[currentPosition]=blockCopy; //保存第(i+1)次缺页记录,后续打印

LackPageIndex[currentPosition][0]=currentPosition;//0下标保存每一次缺页索引

LackPageIndex[currentPosition][1]=PageOrder[currentPosition];//1下标保存插入的页面

LackPage++;//缺页数++

break;//下一个页面

}

}

}

}

}

double LackPagePercent=((double)LackPage/(double)PageOrder.length);

System.out.println("OPI算法缺页率,缺页次数,缺页情况如下");

System.out.println("缺页率为"+LackPagePercent*100+"%"+" ;"+"缺页次数为"+LackPage);

Print(PageOrder,PagePrint);

}

public int FindLastIn(int block[],int currentPosition,int[]PageOrder)

{

//找到这三个页面出现的三个最大下标

//从当前位置向后找,找到在物理块中最迟出现的页面,返回最迟出现在物理快中页面的索引

int FindIndex=currentPosition;

LinkedList List=new LinkedList();

LinkedList Page=new LinkedList();

A:for(;currentPosition

{

for(int i=0;i

{

//从当前位置向后寻找,找到了

if(block[i]==PageOrder[currentPosition])

{

//找到了第i个页面出现的位置          如果页面不存在,保存页面,保存索引,如果页面已存在,则不保存索引

if(!Page.contains(PageOrder[currentPosition]))

{

Page.add(PageOrder[currentPosition]);//保存页面

List.add(currentPosition); //保存最大索引

}

if(List.size()==block.length)

break A;

}

else continue;//没找到则继续往后

}

}

boolean existence=false;

int minIndex=PageOrder.length;

if(currentPosition==PageOrder.length)

{

//页面序列找到头了,有一个,或多个页面没有找到;

//直接返回该页面的下标

for(int i=0;i

{

if(Page.contains(block[i]))//筛选出没有找到的页面

continue;

else

{

//返回该页面的下标

if(block.length-Page.size()==1)

{

//有一个页面没找到

for(;0

{

if(block[i]==PageOrder[FindIndex])

return FindIndex;

}

}

if(block.length-Page.size()>1)

{

//有多个页面未找到,返回页面最小的下标

//找到找不到的页面,比较两个页面所在物理块的下标,选择下标最小的页面返回,返回物理快中出现的页面最小下标

existence=true;//确实存在多个页面未找到

int FindIndexCopy=FindIndex;

for(;0

{

if(block[i]==PageOrder[FindIndex])

{

if(FindIndex

minIndex=FindIndex;

}

}

FindIndex=FindIndexCopy;//重置

}

}

}

}

if(existence==true)

return minIndex;

Integer [] saveIndex=new Integer[List.size()];

List.toArray(saveIndex);

int FirstLastIndex=0;

for(int j=0;j

{

if(saveIndex[j]>FirstLastIndex)

{

//找到最迟出现的下标

FirstLastIndex=saveIndex[j];

}

}

return FirstLastIndex;//返回最迟出现页面的下标

}

public void LRU(int  PageOrder[],int block[])

{

//最久未使用算法

/*

* 最开始,先把物理块放满

* 在物理块放满之后,对物理块进行判断,判断当前页面是否在物理块中,在则不用置换,不在则找到最早出现在物理块中的页面(最小数组下标)

* 找到后,将其替换掉(替换的同时计置换的次数),进行下一轮判断

* */

int [][]LackPageIndex=new int [PageOrder.length][2];//保存每一次缺页索引以及插入的页面

int [][]PagePrint=new int [PageOrder.length] []; //保存每一次缺页记录

int []blockCopy=new int [block.length];

int LackPage=0; //缺页数

boolean existence; //用来标记页面是否存在于物理块中

for(int i=0;i

{

//开放内存空间

PagePrint[i]=new int [block.length];

}

for(int i=0;i

{

//开放内存空间

LackPageIndex[i]=new int [2];

}

for(int currentPosition=0;currentPosition

{

existence=false;

for(int j=0;j

{

if(block[j]==PageOrder[currentPosition])

{

//当前页面存在物理块中

existence=true;

break;

}

else  continue;

}

if(existence)

{

continue;

}

if(!existence)

{

//当前页面不存在物理块中:1.物理块没满,直接加入;2.物理快满了,从当前位置向前找,筛选出最先开始在物理块中出现的页面

if(BlockIsFull(block))

{

//物理块满了

int firstIn=FindFirstIn(block,currentPosition,PageOrder);//找出最开始在物理快中出现的页面下标

int pagePosition=ReplacePage(block,PageOrder[firstIn]);//页面在物理块中的位置

block[pagePosition]=PageOrder[currentPosition];  //用当前页面替换旧的页面

blockCopy=Arrays.copyOf(block, block.length);//拷贝当前缺页数组

PagePrint[currentPosition]=blockCopy; //保存次缺页记录,后续打印

LackPageIndex[currentPosition][0]=currentPosition;//0下标保存每一次缺页索引

LackPageIndex[currentPosition][1]=PageOrder[currentPosition];//1下标保存插入的页面

LackPage++;//缺页数++

continue;

}

else

{

//物理块没满

for(int k=0;k

{

if(block[k]==-1)

{

block[k]=PageOrder[currentPosition];//将页面放入物理块中

blockCopy=Arrays.copyOf(block, block.length);//拷贝当前缺页数组

PagePrint[currentPosition]=blockCopy; //保存次缺页记录,后续打印

LackPageIndex[currentPosition][0]=currentPosition;//0下标保存每一次缺页索引

LackPageIndex[currentPosition][1]=PageOrder[currentPosition];//1下标保存插入的页面

LackPage++;//缺页数++

break;//下一个页面

}

}

}

}

}

double LackPagePercent=((double)LackPage/(double)PageOrder.length);

System.out.println("LRU算法缺页率,缺页次数,缺页情况如下");

System.out.println("缺页率为"+LackPagePercent*100+"%"+";"+"缺页次数为"+LackPage);

Print(PageOrder,PagePrint);

}

public void Print(int[]PageOrder,int [][]PagePrint)

{

System.out.println("缺页情况如下:———————————————————————————————————————————————————————————————————————————————————————");

for(int i=0;i

System.out.print(PageOrder[i]+"    ");

System.out.println();

for(int i=0;i

{

for(int j=0;j

{

String zere="00";

String isZero="";

for(int n=0;n

isZero=isZero+PagePrint[j][n];

if(PagePrint[j][i]==-1)

{

System.out.print("    ");

continue;

}

if(isZero.trim().contains(zere))

{

System.out.print("    ");

continue;

}

System.out.print("  "+PagePrint[j][i]+"  ");

}

System.out.println();

}

}

}

public class Experiment_5 {

//物理块为3 OPI算法:  45% 9次

//物理块为3 FIFO算法:  75% 15次

//物理块为3 LRU算法:  60% 12次

//物理块为4 OPI算法: 40% 8次

//物理块为4 FIFO算法:  50% 10次

//物理块为4 LRU算法:  40%  8次

public static void main(String[] args)

{

Scanner Input=new Scanner(System.in);

System.out.println("输入页面访问序列:(以逗号隔开)");

String GetpageOrder=Input.nextLine();//7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1

System.out.println("请输入物理块大小:");

int blockSize=Input.nextInt();

Input.close();

String []pageOrder=GetpageOrder.split(",");

int []PageOrder=new int [pageOrder.length];

for(int i=0;i

PageOrder[i]=Integer.parseInt(pageOrder[i]);

int block[]=new int [blockSize];

for(int i=0;i

block[i]=-1;

//7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7,7

//int  PageOrder[]= {7,0,1,2,0,3,0,4,2,3,0,3,2,1,2,0,1,7,0,1};//页面访问序列

//int block[]= {-1,-1,-1};//物理块

//int block[]= {-1,-1,-1,-1};//物理块

//new PageReplacementAlgorithm().OPI(PageOrder, block);

//new PageReplacementAlgorithm().FIFO(PageOrder, block);

new PageReplacementAlgorithm().LRU(PageOrder, block);

}

}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/294415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

解答网友提问 | 使用VS2022快速生成React/Angular/Vue.js + Web API前后端集成项目

前言上次发表了《一键生成Vue.js Web API前后端集成项目》后,有多位网友来问,有不有其他的前后端集成模板:实际上,VS2022没有提供前后端集成项目模板。但是,使用VS2022,同样可以轻松实现React/Angular/Vue…

地球上最快的速度......

1 新手司机的车能多不靠谱(素材来源网络,侵删)▼2 ???(素材来源网络,侵删)▼3 哈哈哈哈,实在是太像了▼4 狗子:飞来横祸(素材来源网…

链表之判断一个链表是否为回文结构(三)

package com.chenyu.zuo.linkedList;import com.chenyu.zuo.linkedList.PrintCommonPart.Node;/*** 题目:给定一个头结点,判断该链表是否回文结构 * 例如: * 1->2->1 true * 1->2->2->1 true * 1->2->3 false *思路:*我们只需要几个变量,额外空…

Android之二维码扫描的总结

第一步:导入zxing.jar包 第二步:项目中导入相关的类 关键代码: package com.example.qr_codescan; import android.app.Activity; import android.content.Intent; import android.graphics.Bitmap; import android.os.Bundle; import android.view.View; impor…

豆瓣评分9.4分!这部大片你不应该错过,每一秒都是不敢看的残忍!

全世界只有3.14 % 的人关注了爆炸吧知识人类占据了地球上绝大多数宜居的地方,我们面对着温柔的地球母亲,但对野生动物们来说,地球却是一个水深火热的星球。你觉得你已经一无所有了,你觉得生活的负荷已经让你难以前进了&#xff1b…

Dapr云原生应用开发系列7:工作流集成

题记:这篇介绍一个很有意思的东西,Dapr和Logic Apps这样的工作流引擎集成。Dapr工作流在1年多前,Dapr的孵化团队搞了一个很有意思的东西:把Dapr和Logic Apps集成起来,实现Dapr内置的工作流引擎。官方文档:h…

gitlab4安装mysql出问题解决方法

mysql不能自动安装 在新安装的ubuntu系统上面bunlde的时候遇到了这样一个问题: [ruby] view plaincopyInstalling mysql2 (0.3.11) with native extensions Gem::Installer::ExtensionBuildError: ERROR: Failed to build gem native extension. /home…

java.lang.illegalagr_spring – java.lang.IllegalArgumentException:环境不能为null

我尝试设置一个基本的SolrRepository应用程序并在ApplicationContext加载期间出现此错误:Caused by: java.lang.IllegalArgumentException: Environment must not be null!at org.springframework.util.Assert.notNull(Assert.java:112)at org.springframework.data…

项目如何从 SVN 迁移到 Git

为什么80%的码农都做不了架构师?>>> #0 系列目录# 版本管理SVN版本管理:场景命令实战SVN版本管理:两种开发模式GIT版本管理:场景命令实战GIT版本管理:Git Flow模型项目如何从 SVN 迁移到 Git很多有点历史的…

apache+php windows下配置

2014年1月9日 13:58:54 现在PHP大部分是vc9编译的,其扩展在windows下大部分也都是用vc9编译的(memcache,xdebuge...),,所以要想ApachePHPPHP扩展能正确使用,Apache最好也用vc9编译的 Apache vc9 http://www.apachelounge.com/转载于:https://www.cnblogs.com/iLoveMyD/p/351211…

这7个数学问题,10个人里面竟然只有3人能答对!看完发现大神竟是我自己......

全世界只有3.14 % 的人关注了爆炸吧知识今天超模君要问模友们几个问题看看谁才是真正的数学粉丝接受挑战吧1他喜欢抬杠、烫发、搞物理但他是个好数学家他是?点击图片查看答案2他说牛顿抄他的作业两个人因为微积分吵了一辈子他是?点击图片查看答案3传说他…

Android之不需要自定义View(ViewfindView.java)最简单的二维码扫描

不废话,先爆照 第一步: 看下我项目里面的类结构 第二步: 给项目添加zxing.jar包 add as library

python多进程间通信_python多进程间通信代码实例

python多进程间通信代码实例这篇文章主要介绍了python多进程间通信代码实例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下这里使用pipe代码如下:import timefrom multiprocessing import Processim…

mysql数据库服务器设置访问权限

1 GRANT ALL PRIVILEGES ON *.* TO 用户名% IDENTIFIED BY 密码 WITH GRANT OPTION; 2 3 flush privileges; 转载于:https://www.cnblogs.com/lsl8966/archive/2012/12/28/2836820.html

有奖问题征集|向大咖Scott 发问,好礼等你领!

经过数月紧锣密鼓的筹备, .NET Conf China 2021 即将在 12 月 18 日如期而至。好的生态发展离不开好的技术布道者—— .NET 能有如今规模,除了 .NET 人自身的努力,绝对绕不开“Scott Hanselman”这个名字。在全球 .NET 开发者里,S…

zabbix2.2升级到zabbix3.0.2

1、操作系统环境[rootServer ~]# cat /etc/issue CentOS release 6.4 (Final) Kernel \r on an \m [rootServer ~]# uname -r 2.6.32-358.el6.x86_64 [rootServer ~]# uname -m x86_64备份备份。。[rootServer ~]# cp -a /usr/share/zabbix /tmp/zabbix.bak备份数据库&#xff…

Android之应用坐标系统全面详解

来自:http://blog.csdn.net/yanbober/article/details/50419117 1 背景 去年有很多人私信告诉我让说说自定义控件,其实通观网络上的很多博客都在讲各种自定义控件,但是大多数都是授之以鱼,却很少有较为系统性授之于渔的文章&#…

震撼!豆瓣评分9.3,这部纪录片带你感受生命之重!

全世界只有3.14 % 的人关注了爆炸吧知识达尔文的进化论为后人研究生命起源开启了明窗,“物竞天择,适者生存”的法则在各种生物演变上得到了印证,自然环境也是新物种产生、旧物种灭亡的关键因素。因此,生物进化是自然界的必然趋势&…

QAction添加事件响应

为菜单Help下的About添加响应 about对应actionAbout 点击QAction会发出triggered()信号,所以,我们要做的是声明一个slot,然后connect这个信号。 头文件中 public slots: void showAboutMsg(); 构造函数中 connect(actionAbout,SIGNAL(trigger…

WPF学习笔记(二):初学者避坑实录

使用 KeyBinding 实现文本框回车提交文本框的回车提交是一个很常见的需求:在一个复杂的筛选页面上,用户希望在输入框输入文字后直接回车即可触发查询,而不是非得点击一下搜索按钮。假设需要在用户输入回车时触发 TestCommand 命令&#xff0c…