实验四 模拟FIFO页面置换算法
一、实验目的:用c/c++/java模拟FIFO页面置换算法
二、实验内容:随机一访问串和驻留集的大小,通过模拟程序显示淘汰的页号并统计命中率。示例:
输入访问串:7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1
驻留集大小:3
算法的实现:FIFO淘汰算法总是淘汰最先进入内存的页面,即选择在内存中驻留时间最久的页面进行淘汰。该算法实现只需把一个进程已调入内存的页面,按访问的时间先后顺序链接成一个队列,并设置一个指针,该指针始终指向“最老“的页面。
7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1
7 7 7 2 2 2 2 4 4 4 0 0 0 0 0 0 0
0 0 0 0 3 3 3 2 2 2 2 2 1 1 1 1
1 1 1 1 0 0 0 3 3 3 3 3 2 2 2
× × × × × × × × × × × ×
7 0 1 2 3 0 4 2 3
红色表示:指针指向调入内存的页面中“最老“的页面
通过模拟程序输出淘汰的页号分别为:7 0 1 2 3 0 4 2 3
命中率为:5/13
- 运行结果:
背景: 这是我们操作系统课程的一道实验题
这道题本来是一道非常简单的题,但是自己没仔细看题,加上对算法理解不够深刻,导致自己认为是最近最久未使用(LRU)算法,所以多花了半个小时测试,最后再仔细看了一下题,去掉一段代码,瞬间出来了
解题思路:
首先这里我是用Java写的,然后定义三个集合,一个是获取输入顺序,一个是内存集合,一个是淘汰页面的集合
其次依次遍历输入顺序集合,每一次遍历都要表示时间加1,这里要默认内存中是没有当前遍历到的页面,
然后在内存集合中找是否有这个页面,找到的话就直接将内存中的页面的驻留时间加1
如果没有找到那么就看内存中的页面数是否大于内存最大容量,如果小于就直接加入页面,如果等于就进行置换
置换是看哪个页面的驻留时间最长,置换掉驻留时间最长的页面然后再将内存中的页面的时间加1就可以了
参考代码如下:
package com.eternally.practice;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
class Page {
int value;
int time;
public Page(int value, int time) {
this.value = value;
this.time = time;
}
}
public class Test2 {
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n;
int base;//
int target = 0;// 命中
n = in.nextInt();
List<Page> list = new ArrayList<>();
for (int a = 0; a < n; a++) {
int x = in.nextInt();
Page page = new Page(x, 0);// 初始化
list.add(page);// 加入集合中
}
base = in.nextInt();
List<Page> targetlist = new ArrayList<>();// 定义淘汰的集合
List<Page> list_base1 = new ArrayList<>();// 定义容器集合
for (int a = 0; a < list.size(); a++) {
int flag = 0;// 默认不存在
// 判断新进来的进程的页面再内存中是否存在
for (int b = 0; b < list_base1.size(); b++) {
if (list_base1.get(b).value == list.get(a).value) {
target++;
flag = 1;
break;
}
}
//如果内存中没有
if (flag == 0) {
if (list_base1.size()<base) {
list_base1.add(list.get(a));// 将新的加入
} else {
int maxtime = -1;
int locat = 0;
// 在内存中找出存在时间最久的
for (int b = 0; b < list_base1.size(); b++) {
if (maxtime < list_base1.get(b).time) {
maxtime = list_base1.get(b).time;
locat = b;
}
}
targetlist.add(list_base1.get(locat));// 加入淘汰的
list_base1.set(locat, list.get(a));// 删除时间最久的并加入最新的;
}
}
//时间增加
for (int b = 0; b < list_base1.size(); b++) {
list_base1.get(b).time=list_base1.get(b).time+1;
}
}
System.out.println("淘汰页号:");
for (int a = 0; a < targetlist.size(); a++) {
System.out.print(targetlist.get(a).value + " ");
}
System.out.println("命中率:" + target + "/" + n);
}
}