流程图:
代码实现:
import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;
import java.util.Queue;
public class FIFO {
/**
* FIFO页面置换算法
*对memoryPages序列进行遍历,将每个页面加载到内存中,
* 如果内存中没有足够的空间,就需要按照先进先出规则选择一个已有的页面或新页面进行替换
* @param memoryPages 一个包含访问内存页序列的整数数组。
* @param numFrames 表示物理内存可用空间大小,即可同时存放多少个页面。
* @return 返回页面置换的次数
*/
public static int fifo(int[] memoryPages, int numFrames) {
List<Integer> pages = new ArrayList<>(); //内存页表里的页面
Queue<Integer> queue = new LinkedList<>(); //页面进入内存页表的顺序
int pageFaults = 0; // 页面置换次数
for (int page : memoryPages) {
if (!pages.contains(page)) { //页面不在内存页表中
pageFaults++; //发生页面置换
if(pages.size()>=numFrames){//页表已满,替换最先进入内存的页面
int removedPage = queue.poll();//把队列第一个页面删除,即最早进入队列的元素
//poll()从队列中获取并删除头部元素
pages.remove(Integer.valueOf(removedPage)); //从页表里删除最早的页面,这里根据队列获取的值删除
}
pages.add(page);//页表添加新的页面
queue.offer(page);//队列最后面添加最新进来的页面
} else { //页面已在内存页表中
//更新页面在队列里的顺序,(先删除原先的,再将该页面添加到队列的尾部)
queue.remove(Integer.valueOf(page));
queue.offer(page);
}
System.out.println(queue);
}
System.out.println("缺页次数:"+pageFaults);
System.out.printf("缺页率:%.2f",(pageFaults/(double)memoryPages.length));
return pageFaults;
}
public static void main(String[] args) {
int[] pages={1,2,3,4,2,1,5,6,2,1,3,7,6,3,2,1,2,3,6};
int num=3;
System.out.println("进入内存的页面序列:");
for(int i=0;i<pages.length;i++){
System.out.print(i + " ");
}
System.out.println();
System.out.println("页表的顺序:");
fifo(pages,num);
}
}