操作系统原理实验五——编程模拟页面置换算法,输入:物理块数、页走向 输出:提示信息(包括学生学号、姓名) 内存驻留信息、缺页率

一.实验目的:

输入:物理块数、页走向

     输出:提示信息(包括学生学号、姓名)

     内存驻留信息、缺页率

  1. 实验环境:

            IDEA

二.实验步骤:

一、设计数组存储内存驻留信息

二、输入物理块数、页走向

三、循环模拟页面置换算法过程,

根据算法置换页,输出内存驻留信息,

统计缺页

四.输出缺页率

三.代码模块:

import java.util.ArrayList;
import java.util.Collections;
import java.util.Scanner;


public class Test5 {

    // 最佳置换算法
    // opt 最佳页面置换算法
    static void opt(ArrayList<Integer> frame, ArrayList<Integer> page) {
        System.out.println("============opt最佳页面置换算法============");
        // 框和页面长度
        int n_f = frame.size();
        int n_p = page.size();
        // 缺页
        int n_lack = n_f;
        // 判断块:初始每个块对应的页面很大
        ArrayList<Integer> judge = new ArrayList<Integer>(n_f);
        for (int i = 0; i < n_f; i++) {
            judge.add(99);
        }
        for (int i = 0; i < n_p; i++) {
            System.out.print(page.get(i) + "===");
            if (i < n_f) {
                // 预装入
                frame.set(i, page.get(i));
                System.out.println(frame);
            } else {
                if (frame.contains(page.get(i))) {
                    // 页面已经存在在物理快中
                    System.out.println("页面已经存在于物理块");
                } else {
                    // 更新往后页面第一次出现的位置
                    for (int j = 0; j < 3; j++) {
                        int index = 99;
                        for (int k = i + 1; k < n_p; k++) {
                            if (frame.get(j) == page.get(k)) {
                                index = k;
                                break;
                            }
                        }
                        // 更新(
                        judge.set(j, index);
                    }
                    // 根据出现最后的(即judge对应最大的)替换
                    int index_max = judge.indexOf(Collections.max(judge));
                    int rep_page = frame.get(index_max);
                    frame.set(index_max, page.get(i));
                    System.out.print(frame);
                    System.out.println("  替换掉了页面:" + rep_page);
                    n_lack = n_lack + 1;
                }
            }
        }
        float p_lack = 100 * (float) n_lack / n_p;
        System.out.println("21XXXXXXX 吴XX===================================");
        System.out.printf("缺页次数:%d\n", n_lack);
        System.out.printf("缺页率: %.2f%%\n", p_lack);
        System.out.println("===================================");
    }

    // fifo 先行先出算法
    // fifo 先进先出置换算法
    static void fifo(ArrayList<Integer> frame, ArrayList<Integer> page) {
        System.out.println("============fifo先进先出置换算法============");
        // 框和页面长度
        int n_f = frame.size();
        int n_p = page.size();
        // 缺页
        int n_lack = n_f;
        // 判断块:初始每个块对应的出现次数
        // 因为在预装入之后才会有相应的判断
        // 使用我将判断的状态直接设置成预装入之后 即为 3 2 1
        ArrayList<Integer> judge = new ArrayList<Integer>(n_f);
        for (int i = 0; i < n_f; i++) {
            judge.add(3 - i);
        }

        for (int i = 0; i < n_p; i++) {
            System.out.print(page.get(i) + "===");
            if (i < n_f) {
                // 预装入
                frame.set(i, page.get(i));
                System.out.println(frame);
            } else {
                // 每个页面存在次数加1
                for (int j = 0; j < n_f; j++) {
                    judge.set(j, judge.get(j) + 1);
                }
                if (frame.contains(page.get(i))) {
                    // 页面已经存在在物理块中
                    System.out.println("页面已经存在于物理块");
                } else {
                    // 根据存在最久的(即judge对应最大的)替换
                    int index_max = judge.indexOf(Collections.max(judge));
                    int rep_page = frame.get(index_max);
                    frame.set(index_max, page.get(i));
                    // 将新换进的存在状态设置为1
                    judge.set(index_max, 1);
                    System.out.print(frame);
                    System.out.println("  替换掉了页面:" + rep_page);
                    n_lack = n_lack + 1;
                }
            }
        }
        float p_lack = 100 * (float) n_lack / n_p;
        System.out.println("21XXXXXXXX 吴XX===================================");
        System.out.printf("缺页次数:%d\n", n_lack);
        System.out.printf("缺页率: %.2f%%\n", p_lack);
        System.out.println("===================================");
    }

    // lru 最近最久未使用算法
    static void lru(ArrayList<Integer> frame, ArrayList<Integer> page) {
        System.out.println("===========lru最近最久未使用算法===========");
        // 框和页面长度
        int n_f = frame.size();
        int n_p = page.size();
        // 缺页
        int n_lack = n_f;
        // 和fifo类似先设置为 3 2 1
        ArrayList<Integer> judge = new ArrayList<Integer>(n_f);
        for (int i = 0; i < n_f; i++) {
            judge.add(3 - i);
        }

        for (int i = 0; i < n_p; i++) {
            System.out.print(page.get(i) + "===");
            if (i < n_f) {
                // 预装入
                frame.set(i, page.get(i));
                System.out.println(frame);
            } else {
                // 每个页面存在次数加1
                for (int j = 0; j < n_f; j++) {
                    judge.set(j, judge.get(j) + 1);
                }
                if (frame.contains(page.get(i))) {
                    // 页面已经存在在物理块中
                    System.out.println("页面已经存在于物理块");
                    // 这一步fifo没有
                    // 将页面的使用重置为1
                    judge.set(frame.indexOf(page.get(i)), 1);
                } else {
                    // 根据最久未使用的(即judge对应最大的)替换
                    int index_max = judge.indexOf(Collections.max(judge));
                    int rep_page = frame.get(index_max);
                    frame.set(index_max, page.get(i));
                    // 将新换进的使用状态设置为1
                    judge.set(index_max, 1);
                    System.out.print(frame);
                    System.out.println("  替换掉了页面:" + rep_page);
                    n_lack = n_lack + 1;
                }
            }

        }
        float p_lack = 100 * (float) n_lack / n_p;
        System.out.println("21XXXXXXXX 吴XXX===================================");
        System.out.printf("缺页次数:%d\n", n_lack);
        System.out.printf("缺页率: %.2f%%\n", p_lack);
        System.out.println("===================================");
    }

    public static void main(String[] args) {
        Scanner scanner = new Scanner(System.in);
        System.out.print("请输入分配给该作业的物理页框块数:");
        int n_frame = scanner.nextInt(); // 物理页框数
        ArrayList<Integer> frame = new ArrayList<Integer>(n_frame);
        for (int i = 0; i < n_frame; i++) {
            frame.add(-1);
        }

        System.out.print("请输入该作业的页面走向:");
        scanner.nextLine(); // 控制输入格式
        String inputPages = scanner.nextLine();
        String[] split = inputPages.split("\\s+|,|,");
        int n_page = split.length; // 作业的页面走向总次数
        ArrayList<Integer> page = new ArrayList<Integer>(n_page); // 作业的页面走向
        for (int i = 0; i < n_page; i++) {
            page.add(Integer.parseInt(split[i]));
        }

        scanner.close();

        // 测试输入
        // 3
        // 7 0 1 2 0 3 0 4 2 3 0 3 2 1 2 0 1 7 0 1
        //opt(frame, page);
        //   fifo(frame, page);
       lru(frame, page);
    }
}

  • 4
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
一、实验题目:页面置换算法(请求分) 二、实验目的: 进一步理解父子进程之间的关系。 1) 理解内存面调度的机理。 2) 掌握页面置换算法的实现方法。 3) 通过实验比较不同调度算法的优劣。 4) 培养综合运用所学知识的能力。 页面置换算法是虚拟存储管理实现的关键,通过本次试验理解内存面调度的机制,在模拟实现FIFO、LRU等经典页面置换算法的基础上,比较各种置换算法的效率及优缺点,从而了解虚拟存储实现的过程。将不同的置换算法放在不同的子进程中加以模拟,培养综合运用所学知识的能力。 三、实验内容及要求 这是一个综合型实验,要求在掌握父子进程并发执行机制和内存页面置换算法的基础上,能综合运用这两方面的知识,自行编制程序。 程序涉及一个父进程和两个子进程。父进程使用rand()函数随机产生若干随机数,经过处理后,存于一数组Acess_Series[]中,作为内存面访问的序列。两个子进程根据这个访问序列,分别采用FIFO和LRU两种不同的页面置换算法内存面进行调度。要求: 1) 每个子进程应能反映出面置换的过程,并统计页面置换算法的命中或缺情况。 设缺的次数为diseffect。总的面访问次数为total_instruction。 缺页率 = disaffect/total_instruction 命中率 = 1- disaffect/total_instruction 2)将为进程分配的内存面数mframe 作为程序的参数,通过多次运行程序,说明FIFO算法存在的Belady现象。
这里提供一种基于C语言的、模拟最佳页面置换算法实验代码: ```c #include <stdio.h> #include <stdlib.h> #define MAX_PAGE 20 // 内存最大面数 #define MAX_REF 100 // 最大参考面数 int pages[MAX_PAGE]; // 存放内存面的数组 int refs[MAX_REF]; // 存放参考面序列的数组 int nframes; // 内存面数 int nrefs; // 参考面数 // 判断面是否在内存中 int page_in_mem(int page) { for (int i = 0; i < nframes; i++) { if (pages[i] == page) { return 1; } } return 0; } // 查找最远的未来引用面 int find_max_distance(int start, int end) { int max_dist = -1; int max_page = -1; for (int i = 0; i < nframes; i++) { int found = 0; for (int j = start; j <= end; j++) { if (pages[i] == refs[j]) { found = 1; int dist = j - start; if (dist > max_dist) { max_dist = dist; max_page = pages[i]; } break; } } if (!found) { return pages[i]; } } return max_page; } // 执行最佳页面置换算法 int execute_opt() { int pagefaults = 0; for (int i = 0; i < nrefs; i++) { if (!page_in_mem(refs[i])) { int page = find_max_distance(i+1, nrefs-1); for (int j = 0; j < nframes; j++) { if (pages[j] == page) { pages[j] = refs[i]; pagefaults++; break; } } } } return pagefaults; } int main() { // 读入内存面数和参考面序列 printf("Enter number of frames: "); scanf("%d", &nframes); printf("Enter reference string (max length %d): ", MAX_REF); for (int i = 0; i < MAX_REF; i++) { int page; scanf("%d", &page); if (page < 0) { break; } refs[i] = page; nrefs++; } // 执行最佳页面置换算法 int pagefaults = execute_opt(); // 输出结果 printf("Number of page faults: %d\n", pagefaults); return 0; } ``` 使用该程序进行实验时,需要先输入内存面数和参考面序列。程序会模拟最佳页面置换算法的执行过程,并输出面缺次数。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

杪商柒

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值