页面替换FIFO、LRU----------Java实现

Java实现
1、实验要求
在这里插入图片描述
1、实验结果
在这里插入图片描述
地址流整理、FIFO替换结果
在这里插入图片描述
LRU页面替换(代码中不包含这部分)
在这里插入图片描述

堆栈实现LRU

在这里插入图片描述
不同页数命中情况
在这里插入图片描述
在这里插入图片描述

package project0202;

import java.util.*;

public class projectmain {

	public static void FIFO(ArrayList<Integer> l, int page) {
		ArrayList<String> L = new ArrayList<String>();
		ArrayList<String[]> L1 = new ArrayList<String[]>();
		ArrayList<Integer> LL = new ArrayList<Integer>();
		int i = 0;
		int j = 0;
		while (i < l.size()) {
			String s[] = new String[page];
			if (LL.size() < page && !LL.contains(l.get(i))) {
				LL.add(l.get(i));

				L.add("移进");
			} else if (LL.size() < page) {

				L.add("命中");
			} else {
				if (!LL.contains(l.get(i))) {
					LL.set(j % page, l.get(i));

					j++;
					L.add("替换");
				} else {

					L.add("命中");
				}

			}
			for (int t = 0; t < LL.size(); t++) {
				s[t] = LL.get(t).toString();
			}
			if (LL.size() == page) {
				s[j % page] += "*";
			}
			L1.add(s);
			i++;
		}
		for (int n = 0; n < page; n++) {
			for (int t = 0; t < l.size(); t++) {
				System.out.print(L1.get(t)[n] + "\t");
			}
			System.out.println();
		}
		for (int t = 0; t < l.size(); t++) {
			System.out.print(L.get(t) + "\t");
		}
		int count = Collections.frequency(L, "命中");
		double d = (double) count / l.size();
		System.out.println();
		System.out.println("命中次数:\t" + count + "\t地址流个数:\t" + l.size());
		System.out.println("命中率为:\t" + d);
		System.out.println();

	}

	public static void LRU(ArrayList<Integer> l, int page) {
		ArrayList<ArrayList<String>> L = new ArrayList<ArrayList<String>>();
		ArrayList<ArrayList<Integer>> L1 = new ArrayList<ArrayList<Integer>>();

		int i = 0;
		do {
			ArrayList<Integer> LL = new ArrayList<Integer>();
			if (i != 0)
				LL.addAll(L1.get(L1.size() - 1));
			if (LL.contains(l.get(i))) {

				LL.remove(l.get(i));
//				System.out.println(LL);
				LL.add(l.get(i));
//				System.out.println(LL);
			} else {

				LL.add(l.get(i));

			}
			i++;
			L1.add(LL);
		} while (i < l.size());
		HashSet<Integer> set = new HashSet<Integer>();
		set.addAll(l);
		int N = set.size();
//		System.out.println(N);
		int n = 1;
		while (n <= N) {
			ArrayList<String> L0 = new ArrayList<String>();
			ArrayList<Integer> LL = new ArrayList<Integer>();
			i = 0;
			while (i < l.size()) {
				if (i != 0)
					LL = (ArrayList<Integer>) L1.get(i - 1).clone();
//				LL.remove(LL.size()-1);
				if (LL.contains(l.get(i))) {
					if (LL.indexOf(l.get(i)) < LL.size() - n) {
						L0.add("替换");
					} else
						L0.add("命中");
				} else {
					if (LL.size() < n) {
						L0.add("移入");
					} else
						L0.add("替换");
				}
				i++;
			}
			L.add(L0);
			n++;
		}
		int j = 0;
		while (j < N) {
			for (i = 0; i < L1.size(); i++) {
				if (j < L1.get(i).size()) {
					System.out.print(L1.get(i).get(L1.get(i).size() - j - 1) + "\t");
				} else
					System.out.print(" " + "\t");
			}
			j++;
			System.out.println();
		}
		j = 0;
		while (j < N) {
			for (i = 0; i < L1.size(); i++) {
				System.out.print(L.get(j).get(i) + "\t");
			}
			int count = Collections.frequency(L.get(j), "命中");
			double d = (double) count / l.size();
			System.out.print("\t页数:" +( j+1));
			System.out.print("\t命中次数:" + count + "\t地址流个数:" + l.size());
			System.out.print("\t命中率为:" + d);
			j++;
			System.out.println();
		}

	}

	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		System.out.println("请输入页面大小");
		int pagesize = sc.nextInt();
		System.out.println("请输入主存容量");
		int memorysize = sc.nextInt();
		int page = memorysize / pagesize;
		ArrayList<Integer> L = new ArrayList<Integer>();
		ArrayList<Integer> l = new ArrayList<Integer>();
		System.out.println("请输入地址流个数");
		int i = sc.nextInt();
		System.out.println("请输入" + i + "个地址");
		while (i > 0) {
			L.add(sc.nextInt());
			i--;
		}
		System.out.println(L);
		i = 0;
		while (i < L.size()) {
			l.add(L.get(i) / pagesize);
			i++;
		}
		System.out.println(l);
		FIFO(l, page);
		LRU(l, page);


	}

}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Java图形化界面实现以下要求,我上传给大家一同分享。 通过随机数产生一个指令序列,共 320 条指令,指令的地址按下述原则生成: (1):在[0,319]的指令地址之间随机选取一起点 m。 (2):顺序执行一条指令,即执行地址为 m+1 的指令 。 (3):在前地址[0,m+1]中随机选取一条指令并执行,该指令的地址为 m' 。 (4):顺序执行一条指令,其地址为 m'+1。 (5):在后地址[m'+2,319]中随机选取一条指令并执行。 (6):重复步骤 (1)—(6),直到生成 320 条指令。 2、将指令序列转换为页地址流,比如:页面大小为 1K,用户内存容量 4 页到 32 页,用户虚存容量为 32K;在用户虚存中,按每 K存放 10 条指令排列虚存地址。即 320 条指令在虚存中的存放方式为: 第 0 条-第 9 条指令为第 0 页(对应虚存地址为[0,9])。 第 10 条-第 19 条指令为第 1 页(对应虚存地址为[10,19]) 。 ……………………………… 第 310 条-第 319 条指令为第 31页(对应虚存地址为[310,319])。 按以上方式,用户指令可组成 32页。 3、页面大小的取值范围分别为 1K,2K,4K,8K,16K;按照页面大小将指令地址转化为页号;对于相邻相同的页号,合并为一个。 4、分配给程序的内存块数取值范围为 1 块、2块,一直到程序的页面数。 5、分别采用 FIFOLRU 算法对页号序列进行调度,并计算出对应的缺页中断率。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值