java实现FIFO和LRU页面置换算法

2023-10-31

   FIFO是内存管理的一种页面置换算法,FIFO(First Input First Output),即先进先出队列。例:在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后,眼睁睁地看着前面的客户一个个离开。这就是一种先进先出机制,先排队的客户先行结账离开。

  LRU内存管理的另一种页面置换算法,对于在内存中但又不用的数据块(内存块)叫做LRU,操作系统会根据哪些数据属于LRU而将其移出内存而腾出空间来加载另外的数据。 LRU是Least Recently Used的缩写,即最近最久未使用,常用于页面置换算法,是为虚拟页式存储管理服务的。

JAVA实现如下(可以直接执行):

import java.util.Scanner;

class wuli{
	int vlu;
	int falt;
	 wuli(int vlu ){
		this.falt=-1;
		this.vlu=vlu;
	}
}


public class fifolru {
int mun;            //物理块数
int yemianmun;     //页面个数


fifolru(int mun,int yemianmun) {
	this.mun=mun;
	this.yemianmun=yemianmun;

}
public static void fifo(wuli a[],int b[] ) { //------------------------------------------fifo------------
	System.out.println("+++++++++++++FIFO算法++++++++++++++++");
	int mun=0;
	int count=0;
	for(int q=0;q<a.length;q++) 
		a[q]=new wuli (-2);                //初始化对象	        
	for(int q=0;q<b.length;q++) {  		
		 if(count==a.length) { 
		
			   int f=0;                 //处理满的情况			
			 for(int qq=0;qq<a.length;qq++) {
					if(a[qq].falt==b[q]) {
					 System.out.println("*发现相同,不存入  ");					
					 f=1;
					 break;
					 }
					}				
				if(f==0)  { 
					System.out.println("到达一个元素"+b[q]+"已经满,弹出第一个元素"+a[0].falt+" 末尾加入元素"+b[q]);
					mun++;
			    for(int z=0;z<a.length-1;z++) {      //前移
					 a[z].falt=a[z+1].falt; 
				 }
				 a[a.length-1].falt=b[q];    //最后一个赋值	
				 }
				continue;
			 }	 		 
		    int k=0;
			for(int qq=0;qq<a.length;qq++) {                        //处理未满情况
				if(a[qq].falt==b[q]) {
				 System.out.println("发现相同,不存入  ");				
				 k=1;
				 break;
				}
			}				
			if(k==0)
			{
				for(int z=0;z<a.length;z++)	              
					if(a[z].vlu==-2)                  //找到没用到的物理块
				{ a[z].falt=b[q];	  a[z].vlu=0; 	mun++;count++;System.out.println("没有发现相同,存入  ");	   break;}			
		}
			continue;			
	}			
	System.out.print("++++++++++结果物理块的值:");                  //fifo结果
	for(int a1=0;a1<a.length;a1++) {
		System.out.print(a[a1].falt+"  ");
		}
		System.out.println("++++++++++");
	System.out.println("++++++++++FIFO缺页次数:"+mun+"次  +++++++++++");  
		
}
public static void lru(wuli a[],int b[] ) {     //------------------------------------------------lru
	System.out.println("++++++++++LRU算法++++++++++++");
	int mun=0;
	int count=0;
	for(int q=0;q<a.length;q++) 
		a[q]=new wuli (-2);                              //初始化对象	 
	
	for(int q=0;q<b.length;q++) { 
		
		 if(count==a.length) {                     //处理满的情况	
		
			   int f=0;                		
			 for(int qq=0;qq<a.length;qq++) {
					if(a[qq].falt==b[q]) {
					 System.out.println("*发现相同,不存入,更新位置  ");
					 int ji=qq;
					 
					 for(int s=qq;s>0;s--)
							a[s].falt=a[s-1].falt;
					a[0].falt=b[q];					 
					 f=1;
					 break;
					 }
					}				
				if(f==0)  { 
					System.out.println("到达一个元素"+b[q]+"已经满,弹出最后一个元素"+a[a.length-1].falt+" 首部加入元素"+b[q]);
					mun++;
					for(int s=a.length-1;s>0;s--)
					a[s].falt=a[s-1].falt;
								a[0].falt=b[q];
				 }
				continue;
			 }	
		 		                                                 
	            int k=0;
				for(int qq=a.length-1;qq>= 0;qq--) {                        //处理未满情况
					if(a[qq].falt==b[q]) {
					 System.out.println("发现相同,不存入,更新位置  ");
					 int ji=qq;
					 while(a[ji-1].falt!=-1)
                          { a[ji].falt=a[ji-1].falt ;
                            ji--;
                          }
					 for(int z=a.length-1;z>=0;z--)	              
							if(a[z].vlu==-2) 
								a[z+1].falt=b[q];	

					 					 
					 k=1;
					 break;
					}
				}				
				if(k==0)
				{
					for(int z=a.length-1;z>=0;z--)	              
						if(a[z].vlu==-2)                  //找到没用到的物理块
					{ a[z].falt=b[q];	  a[z].vlu=0; mun++;	count++;System.out.println("没有发现相同,存入  ");
				
					break;}			
			}
				continue;
		
	}
	
	System.out.print("++++++++++结果物理块的值:");                  //lru结果
	for(int a1=0;a1<a.length;a1++) {
		System.out.print(a[a1].falt+"  ");
		}
		System.out.println("++++++++++");
	System.out.println("++++++++++FIFO缺页次数:"+mun+"次  +++++++++++");  
		
}

public static void main(String arg[]) {
Scanner input=new Scanner(System.in);
System.out.println("请输入分配给程序的物理块数");
int mun0=input.nextInt();

wuli wulikuai[]=new wuli[mun0];                   //物理块数组
System.out.println("请输入页面流的个数");
int mun1=input.nextInt();
int yemianmun[]=new int[mun1];               //页面个数数组
fifolru text=new fifolru(mun0, mun1);


System.out.print("请顺序输入页面流");
for(int a=0;a<yemianmun.length;a++) {
 int shuju = input.nextInt();
 yemianmun[a]=shuju;
}
System.out.print("选择fifo算法,还是LRU算法。1——fifo,2——LRU,3——都选择");
int key=input.nextInt();
switch (key) {
case 1:
	fifo(wulikuai, yemianmun);
	break;
case 2:
	lru(wulikuai, yemianmun);
	break;
case 3:
	fifo(wulikuai, yemianmun);
	lru(wulikuai, yemianmun);
	break;
}

}	
	
}


运行:




总结:具体的运行流程结果比较清楚了~就不多解释了,要是有bug请指教~







本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

java实现FIFO和LRU页面置换算法 的相关文章

  • Java 多头中的斐波那契计算显示负值

    我的斐波那契计算器工作正常 但当数字增加时 结果会出现负值 就像它是一个Integer超过其最大值 它正在使用缓存java util Map
  • Java 的 System.arraycopy() 对于小数组有效吗?

    是Java的System arraycopy 对于小数组来说是高效的 或者它是本机方法这一事实是否使其可能比简单的循环和函数调用效率低得多 本机方法是否会因跨越某种 Java 系统桥梁而产生额外的性能开销 稍微扩展一下 Sid 所写的内容
  • 如何在 Java 中根据 XSD 1.1 验证 XML?

    在 Java 中根据 XML Schema 1 1 验证 XML 文件的最佳方法是什么 我从中获取了代码tutorial http www ibm com developerworks xml library x javaxmlvalida
  • Android - 内容值覆盖现有行

    我正在尝试使用插入值ContentValues 我已将 5 个值插入到 5 列中 运行应用程序后 我只有最后一组值的行ContentValues 前四组未插入 ContentValues cv new ContentValues cv pu
  • 为什么Java HashMap的最大容量是1<<30而不是1<<31?

    Why is the maximum capacity of a Java HashMap 1 lt lt 30 and not 1 lt lt 31 even though the max value of an int is 231 1
  • 如何使用 Gradle 2.10 将 ANTLR 词法分析器语法导入到另一个语法中?

    我一直在和 Terence Parr 一起学习 ANTLR 4权威的 ANTLR 4 参考 到目前为止我一直在使用 Gradle 2 10 及其内置 ANTLR 插件进行跟踪 然而 我在获取一些我从第 4 章第 38 41 页改编的代码以使
  • splitByWholeSeparatorPreserveAllTokens 和 split 之间的区别

    有什么区别StringUtils splitByWholeSeparatorPreserveAllTokens and String split With splitByWholeSeparatorPreserveAllTokens 我们可
  • java中main的返回类型

    我想知道为什么java中main方法只有void返回类型 public static void main String args 为什么main方法除了void之外没有其他返回类型 Thanks 简短的回答是 因为这就是语言规范 http
  • 如何加快 jar 签名者的速度?

    我使用 ant 来签署我的 jars 以进行网络启动部署 Ant signjar 在 Web 启动签名时非常慢 如何加快签名过程 我找到了一种可能的解决方案 早些时候 在构建脚本 ant signjar 中 按顺序调用所有 jar 我们使用
  • 从 AlertDialog 返回值

    我想构建一个函数来创建 AlertDialog 并返回用户输入的字符串 这是我用于创建对话框的函数 如何返回该值 String m Text private String openDialog String title AlertDialo
  • Restful WS 中的 WSDL 等价物是什么?如果没有,消费者如何生成所需的客户端类?

    比如说 我在java中有生产者 在 net中有消费者 生产者有一个方法 需要 员工作为方法参数并在数据库中创建员工 对于基于 SOAP 的 ws dot net 客户端将调用 WSDL 并创建存根 包括 dot net 中的员工数据表示 现
  • 在Java中使用==而不是equals来比较不可变对象可以吗

    考虑调用静态工厂方法 valueOf 的两个 Integer 类型的引用 如下所示 Integer a Integer valueOf 10 Integer b Integer valueOf 10 考虑到Integer是不可变的 使用 而
  • 使用 Mockitos 传递参数化输入

    我正在使用 Mockito 进行单元测试 我想知道是否可以使用 Junit 测试中的方式发送参数化输入参数 e g InjectMocks MockClass mockClass new MockClass Test public void
  • 在同一台计算机上设置 JBoss 的多个实例

    我在 JBoss 社区中找到了下一页 http www jboss org community wiki ConfigurePorts http www jboss org community wiki ConfigurePorts 有下一
  • 在Java程序中计算zip文件的md5哈希值

    我有一个 zip 文件 在我的 Java 代码中我想计算 zip 文件的 md5 哈希值 有没有我可以用于此目的的 java 库 一些例子将非常感激 谢谢 几周前我通过这篇文章做到了这一点 http www javalobby org ja
  • Java中如何限制文件大小

    我正在我的应用程序中创建一个文件 并继续向该文件中写入一些内容 但是当我的文件达到一定大小 比如说 100 行 后 我想删除第一行并将新行写入底部 要求是我的文件应该受到限制 但它应该保留我写入文件的最新内容 请告诉我在Java中是否可行
  • Google App Engine数据存储区字符串编码问题

    你好 我正在使用 Google App Engine 进行一个项目 并且需要存储一些字符串 我正在使用 Java 和JDOHelper getPersistenceManagerFactory transactions optional 在
  • 如何检测java控制台中而不是GUI中的箭头键? [复制]

    这个问题在这里已经有答案了 我正在编写一个应用程序 我需要检测其中的箭头键 C 有getch 函数 我们想要获取输入 然后添加对 ASCII 值的检查 我们如何检测输入箭头键 谢谢 我写了一个Java类原始控制台输入 http www so
  • JTable中动态加载大量数据

    这是我的问题 我目前有一个 JTable 其中包含 5 000 到超过 200 000 行 你知道我要说什么了 数据已经加载到内存中了 这不是问题 但是如何 我可以创建一个高效的 JTable 以便它只加载以下行 是可见的 并且任何事件仅作
  • 生成签名和加密的 JWT

    我正在尝试使用生成签名和加密的 JWT 令牌雨云智威汤逊 http connect2id com products nimbus jose jwt private void generateToken throws JOSEExceptio

随机推荐

  • 局域网内共享文件夹

    1 首先新建一个文件夹 2 右键 gt 属性 gt 共享 3 添加项加everyone gt 设置 权限级别 为 读取 写入 gt 共享 4 文件属性设置完毕 然后在网络中设置 右下角网络右键 5 选择 gt 网络和Internet gt
  • 算法训练营第四十天(9.1)

    Leecode 300 最长递增子序列 题目地址 力扣 LeetCode 官网 全球极客挚爱的技术成长平台 题目类型 最长子序列 class Solution public int lengthOfLIS vector
  • 是什么引起数据库响应超时?

    一 问题背景 一个核心业务数据库部署在AWS的EC2实例上 在业务活动期间发生了性能抖动导致业务超时 下面记录一下问题排查的流程 二 问题分析 1 监控指标分析 发生问题后 第一时间肯定要看监控 首先分析服务器基础监控 服务器的Load1使
  • [工业互联-9]:EtherCAT(以太网控制自动化技术)+TwinCAT 在生产自动化控制中的应用 、

    前言 EtherCAT 以太网控制自动化技术 是一个开放架构 以以太网为基础的现场总线系统 其名称的CAT为控制自动化技术 Control Automation Technology 字首的缩写 EtherCAT是确定性的工业以太网 最早是
  • 基于身高与体重数据集与Auto数据集分别进行线性回归和Lasso回归(代码逐行讲解,超细节)

    身高体重 还是先导入要用的包 没下载的要先去下载依赖包 import pandas as pd import statsmodels api as sm from plotly offline import init notebook mo
  • (3)原神角色数据分析-3

    绘图类 在名为 WRITEPHOT py 的文件中 定义如下绘图方式 则在主页面 app py 文件中 可通过如下方式调用 from WRITEPHOTO import WriteScatter WriteFunnel WriteBarDa
  • SpringAop_2通知(新手)和无法找到元素 'aop:aspectj-autoproxy' 的声明

    AspectJ java社区里最完善最流行的AOP框架 在spring2 0以上的版本中 可以使用基于AspectJ注解或基于XML配置的AOP 其实Spring本身提供了aop框架 但是AspectJ更方便 在Spring中启用Aspec
  • UnicodeDecodeError: ‘gbk‘ codec can‘t decode byte 0xac in position 14: illegal multibyte sequence 解决

    这个错误是因为Python默认使用的编码方式 GBK 无法正确解码包含非ASCII字符的文件 可以尝试以下解决方案 1 修改文件编码 将文件的编码方式改为UTF 8或者其他支持中文的编码方式 2 修改代码 在打开文件时指定文件的编码方式 例
  • 云原生之部署wordpress博客及设置圣诞主题风格

    2022年圣诞节到来啦 很高兴这次我们又能一起度过 CSDN诚邀各位技术er分享关于圣诞节的各种技术创意 展现你与众不同的精彩 参与本次投稿即可获得 话题达人 勋章 圣诞快乐 定制勋章 1年1次 错过要等下一年喔 云原生之部署wordpre
  • MongoDB中空间数据的存储和操作

    本文使用官方C Driver 实现在MongoDB中存储 查询空间数据 矢量 空间数据的存储 本例中 从一个矢量文件 shapefile格式 中读取矢量要素空间信息以及属性表 并写入到MongoDB中去 其中读取shapefile文件以及将
  • DeepFake——实际操作

    文章目录 文件结构 执行步骤 效果优化 总结 切图层面 extract层面 select 层面 原始数据优化 执行过程优化 convert 其他优化idea 辅助知识 实验记录 环境配置 环境配置 数据 环境配置 第三方库 环境配置 操作工
  • UE5 C++ Rider 编程指南 0.安装和配置

    目录 0 前言 1 Rider特性 1 1 快速跨平台C 支持 1 2 连接代码和UE编辑器 1 3 协助反射机制和RPC 1 4 代码分析和命名风格 1 5 调试器 1 6 单元测试 2 安装 3 插件 3 1 Dysh Unreal S
  • 特征值分解与奇异值分解原理与计算

    一 特征值 如果一个非零向量v是方阵A的特征向量 将一定可以表示成下面形式 而 是特征向量v对应的特征值 特征值分解是将一个矩阵分解成下面的形式 其中Q是这个矩阵A的特征向量组成的矩阵 是一个对角阵 每一个对角线上的元素就是一个特征值 一个
  • Vuforia AR开发详细教程

    1 unity3d在2017之后已经集成了Vuforia 如果在安装的时候未安装Vuforia 找到相关的安装包 双击进行安装 2 安装完毕之后 正常建立工程即可 3 在GameObject gt Vuforia Engine gt AR
  • Windows 命令大全

    命令简介 cmd是command的缩写 即命令行 虽然随着计算机产业的发展 Windows 操作系统的应用越来越广泛 DOS 面临着被淘汰的命运 但是因为它运行安全 稳定 有的用户还在使用 所以一般Windows 的各种版本都与其兼容 用户
  • 将Github项目克隆到本地

    前言 提示 前提是自己电脑已经安装Git 安装前往下载链接 https git scm com 如下图 下载完毕 运行安装程序 无脑安装 一直next即可 检查安装 Win R 打开命令提示符 输入以下命令 已经安装如下图 命令 git v
  • 矩阵基础1-矩阵的基本知识

    文章目录 一 矩阵的概念 1 1 运动会成绩记录 1 2 什么是矩阵 1 3 矩阵与向量 1 4 矩阵相等 1 5 方阵 1 6 单位矩阵 1 7 负矩阵 上三角阵 下三角阵 1 8 对角方阵 1 9 零矩阵 二 矩阵的线性运算 三 矩阵的
  • 备战2020,软件测试工程师面试题集锦

    虽然测试行业在2019不太景气 面试后的一些面试题归集和总结 为了将来面试时使用 所有的面试题中我发现超过90 都是基础性的面试题 只要有自动化基础 功能测试接触 再加上面试的时候态度ok 且不卑不亢即可 切记 面试时一定要不卑不亢 切记心
  • OCR识别身份证及营业执照图片(Java版)

    本文基于百度智能云平台提供的OCR识别技术 对身份证图片及营业执照图片识别处理 可以说是全网最详尽可用的教程 希望慢慢食用 准备工作 1 百度智能云官网 百度AI开放平台 全球领先的人工智能服务平台 需注册账号 申请开通应程序 目的是为了得
  • java实现FIFO和LRU页面置换算法

    FIFO是内存管理的一种页面置换算法 FIFO First Input First Output 即先进先出队列 例 在超市购物之后会提着我们满满的购物车来到收银台排在结账队伍的最后 眼睁睁地看着前面的客户一个个离开 这就是一种先进先出机制