先进先出(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);
}
}