操作系统- 实验四 模拟FIFO页面置换算法(Java实现)

版权声明:本文为博主原创文章,未经博主允许不得转载。 https://blog.csdn.net/qq_38712932/article/details/84952377

                                                                    实验四 模拟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);
    }

}

 

 

猜你喜欢

转载自blog.csdn.net/qq_38712932/article/details/84952377