模拟请求分页管理中地址转换和缺页中断处理【完整源码带注释】--计算机操作系统算法

源码往下翻
实验课的算法,细节没处理,核心东西已经搞出来了,要用的可以拿去参考

运行截图

在这里插入图片描述

实验题目

在这里插入图片描述
在这里插入图片描述

源码

package com.company;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.Scanner;

public class Page {
    
    
    public static void main(String[] args) {
    
    
        Scanner scanner = new Scanner(System.in);

        //磁盘上有8页作业,初始化
        List<Work> list = new ArrayList<Work>();
        list.add(new Work(1, 0, 0, 0, 1024*1));
        list.add(new Work(2, 0, 0, 0, 1024*2));
        list.add(new Work(3, 0, 0, 0, 1024*3));
        list.add(new Work(2, 0, 0, 0, 1024*2));
        list.add(new Work(4, 0, 0, 0, 1024*4));
        list.add(new Work(2, 0, 0, 0, 1024*2));
        list.add(new Work(1, 0, 0, 0, 1024*1));
        list.add(new Work(4, 0, 0, 0, 1024*4));

        System.out.println("作业开始前状态:\n" + list.toString().toString());
        System.out.println("-------------------------------");

        //主存大小为3
        int sizeInter = 3;
        //主存作业
        ArrayList<Work> listInter = new ArrayList<Work>();

        //读入该内存首逻辑地址
        System.out.println("请输入逻辑首地址");
        int firstInter = scanner.nextInt();
        if (0 == firstInter) {
    
    
            System.out.println("不能为0,退出。");
        } else {
    
    
            //给内存装入作业
            //先把内存装满,默认前三个作业不重复
            for (int i = 0; i < sizeInter; i++) {
    
    
                listInter.add(list.get(i));
                //已在内存,标记设置
                listInter.get(listInter.size() - 1).setExistFlag(1);
                //分配主存块号
                listInter.get(listInter.size() - 1).setInterId(firstInter+listInter.size());
                System.out.print("第" + (i+1) + "行\t内存状态:");
                for (int j = 0; j < listInter.size(); j++) {
    
    
                    System.out.print(listInter.get(j).getPageId() + "\t");
                }
                System.out.println();
            }
            //先进先出
            for (int i = sizeInter; i < list.size()-1; i++) {
    
    
                int j = 0;
                for (; j < listInter.size(); j++) {
    
    
                    //如果内存中已经有该作业,则直接输出并进行下一个作业
                    if (listInter.get(j).getPageId() == list.get(i).getPageId()) {
    
    
                        System.out.println("第" + (i+1) + "行\t内存状态:" + listInter.get(0).getPageId() + "\t" + listInter.get(1).getPageId() + "\t" + listInter.get(2).getPageId());
                        break;
                    }
                }
                if (j == 3) {
    
    
                    //移除页后面的页往前走,内存块页号也要走
                    listInter.get(listInter.size() - 1).setInterId(firstInter+listInter.size()-1);
                    listInter.get(listInter.size() - 2).setInterId(firstInter+listInter.size()-2);
                    listInter.get(0).setInterId(0);
                    listInter.get(0).setExistFlag(0);
                    listInter.remove(0);

                    listInter.add(list.get(i));
                    //已在内存,标记设置
                    listInter.get(listInter.size() - 1).setExistFlag(1);
                    //分配主存块号
                    listInter.get(listInter.size() - 1).setInterId(firstInter+listInter.size());

                    System.out.println("第" + (i+1) + "行\t内存状态:" + listInter.get(0).getPageId() + "\t" + listInter.get(1).getPageId() + "\t" + listInter.get(2).getPageId());
                }
            }
        }
        System.out.println("--------------------------------");
        System.out.println("作业结束,当前状态:\n" + list.toString().toString());
    }
}

class Work{
    
    
    private int pageId;
    private int existFlag;
    private int interId;
    private int modifierFlag;
    private int hark;


    @Override
    public String toString() {
    
    
        return "Work{" +
                "pageId=" + pageId +
                ", existFlag=" + existFlag +
                ", interId=" + interId +
                ", modifierFlag=" + modifierFlag +
                ", hark=" + hark +
                '}' + "\n";
    }

    public Work(int pageId, int existFlag, int interId, int modifierFlag, int hark) {
    
    
        this.pageId = pageId;
        this.existFlag = existFlag;
        this.interId = interId;
        this.modifierFlag = modifierFlag;
        this.hark = hark;
    }

    public int getPageId() {
    
    
        return pageId;
    }

    public void setPageId(int pageId) {
    
    
        this.pageId = pageId;
    }

    public int getExistFlag() {
    
    
        return existFlag;
    }

    public void setExistFlag(int existFlag) {
    
    
        this.existFlag = existFlag;
    }

    public int getInterId() {
    
    
        return interId;
    }

    public void setInterId(int interId) {
    
    
        this.interId = interId;
    }

    public int getModifierFlag() {
    
    
        return modifierFlag;
    }

    public void setModifierFlag(int modifierFlag) {
    
    
        this.modifierFlag = modifierFlag;
    }

    public int getHark() {
    
    
        return hark;
    }

    public void setHark(int hark) {
    
    
        this.hark = hark;
    }
}

愿你心如花木,向阳而生

猜你喜欢

转载自blog.csdn.net/nbcsdn/article/details/103027158