欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

先进先出(FIFO)和最近最久未使用(LRU)页面置换算法

程序员文章站 2024-03-18 08:14:58
...

设计思路:
1. 先进先出算法(FIFO):
根据物理块的使用情况,设置对应物理块的时间作为页面进入物理快的时间,根据页面滞留在物理块中的时间长短置换物理块中的页面。例如,当一个页面需要进入内存时,先查看内存中是否存在该页面,如果不存在该页面,则从外存中调入内存,内存为满时,则从物理块中置换出停留时间最久的页面,然后初始化刚调入内存的页面的时间为0;如果该页面在内存中,则说明不缺页,不需要从外存调入内存,在每个页面运行完之后,内存中每个页面的停留时间做加1操作。
2. 最近最久未使用算法:
该算法则是根据在最近的过去是否有没有用过的页面为依据,外面的页面需要调入内存时,根据最近最久未使用过的页面予以淘汰。


```java
import java.util.Scanner;

public class FIFO {
	public static void main(String[] args) {
		Scanner in=new Scanner(System.in);
		System.out.print("请输入物理块数和页面数:");
		int bNumber=in.nextInt(),pageNumber=in.nextInt();//物理块数,页面数
		int block[]=new int[bNumber];
		int page[]=new int[pageNumber];
		for(int i=0;i<bNumber;i++) {
			block[i]=-1;
		}
		System.out.println();
		System.out.print("请输入页面号:");
		for(int i=0;i<pageNumber;i++) {
			page[i]=in.nextInt();
		}
		
		System.out.println("FIFO算法:");
		LRU(block,page,0);//参数0代表调用FIFO
		System.out.println();
		System.out.println("LRU算法:");
		LRU(block,page,1);//参数1代表调用LRU
	}

	public static void LRU(int b[],int p[],int means) {
		//参数means为0时该函数按FIFO算法运行,为1时按LRU算法运行
		int block[]=new int[b.length];
		int time[]=new int[b.length];
		int page[]=new int[p.length];
		for(int i=0;i<b.length;i++) {
			block[i]=b[i];
			time[i]=0;//初始化时间
		}
		for(int i=0;i<p.length;i++) {
			page[i]=p[i];
		}
		int i=0,j=0,t=0,count=0;//t记录时间,count计算缺页数量
		int insert=0,find=0;//insert代表插入位置,find代表是否在内存的物理块中
		while(i<p.length) {
			if(i<b.length) {
				block[i]=page[i];
				for(int k=0;k<time.length;k++) {//将时间+1操作
					if(block[k]!=-1) {
						time[k]++;
					}
				}
				count++;
			}else if(i>=b.length){
				for(int l=0;l<block.length;l++) {
					if(page[i]==block[l]) {//查找物理块中是否存在当前页面
						if(means==1) {
							time[l]=0;
						}
						find=1;
						break;
					}
				}
				
				if(find==0) {//当前页面不在内存中,找出合适的位置将其插入
					t=time[0];
					for(int k=1;k<block.length;k++) {//找出时间最长的,然后将其置换
						if(t<time[k]) {
							t=time[k];
							insert=k;
						}
					}
					block[insert]=page[i];
					time[insert]=0;//将其时间设置为0
					count++;
				}
				
				for(int k=0;k<time.length;k++) {//将时间+1操作
					time[k]++;
				}
			}
			System.out.print(page[i]+":  ");
			if(find!=1) {
				for(int k=0;k<block.length;k++) {
					if(block[k]!=-1) {
						System.out.print(block[k]+" ");
					}
				}
				System.out.println();
			}
			else {
				System.out.println("不缺页");
			}
			insert=0;
			find=0;
			i++;
		}
		System.out.println("缺页数为:"+count+" "+" 缺页率为:"+(float)count/page.length);
	}
}