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

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

运行截图

在这里插入图片描述

实验题目

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

源码
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;
    }
}

愿你心如花木,向阳而生

### 回答1: 分页管理地址转换是指将逻辑地址转换为物理地址的过程。在分页管理,逻辑地址由页号和页内偏移量组成,而物理地址由页框号和页内偏移量组成。地址转换过程需要使用页表来实现,通过查找页表对应的页号,可以得到该页所在的页框号,然后将页内偏移量加上页框号得到物理地址。 缺页中断处理是指当程序访问的页面不在内存时,操作系统需要将该页面从磁盘读入内存,然后再进行地址转换。这个过程需要使用缺页中断机制来实现,当程序访问的页面不在内存时,CPU会产生一个缺页中断操作系统会根据页表的信息将该页面从磁盘读入内存,并更新页表的信息,然后再重新执行访问该页面的指令。 ### 回答2: 请求分页管理是一种虚拟内存管理技术,将物理内存分成若干等大小的区域(页面),并将进程的逻辑空间也划分成等大小的区域(页)。将进程的页调入物理内存,使进程访问逻辑地址时自动转换为物理地址,从而实现了虚拟内存的抽象。 地址转换请求分页管理的核心操作之一,它主要是将进程的虚拟地址映射到物理地址上。地址转换部分通常位于处理器(CPU)的硬件,其操作链路如下:当CPU访问虚拟地址时,处理器会将该地址发送给地址转换机构。地址转换机构先通过地址转换表得到与该虚拟地址对应的物理页框号,然后再加上虚拟地址的页内偏移量,最终得到物理地址。这个过程是透明的,对进程来说,它看到的仍然是逻辑地址。 缺页中断处理请求分页管理的另一个重要操作,在内存不足时,操作系统会将进程暂时挂起,将进程未能获取的页面调入内存,然后再让进程继续运行。这个过程,当进程访问一个还未被调入内存的页面时,请求分页管理会发出缺页中断信号,从而通知操作系统重新为该进程映射虚拟地址到物理地址的过程,并确定该页面的位置,将其调入内存。 总之,地址转换缺页中断处理请求分页管理的核心操作,这些操作必须快速有效、可靠性强,从而确保操作系统能够高效地管理虚拟内存,满足进程的空间需求。 ### 回答3: 分页管理操作系统一种重要的内存管理技术,它采用虚拟内存和物理内存分离的方,使得进程可以在逻辑上拥有比实际物理内存更大的内存空间。地址转换缺页中断处理分页管理的两个关键技术,以下分别进行详细说明: 地址转换:当进程访问一个虚拟地址时,操作系统需要将该地址转换为实际物理地址,以访问对应的物理存储空间。地址转换过程主要包括两个步骤:页表查找和页内偏移计算。操作系统维护了每个进程的页表,该表记录了虚拟地址和实际物理地址之间的映射关系,当进程访问一个虚拟地址时,首先通过页表进行查找,获取到对应的物理页框号。然后,结合物理页框大小和地址在所在页内的偏移量,计算出实际物理地址。这样,进程就可以通过实际物理地址直接访问物理内存,完成内存读写操作。 缺页中断处理:当进程访问一个虚拟地址,但其对应的物理页框不存在于内存时,就会发生缺页中断操作系统需要进行一系列的处理操作,以将缺失的物理页框从存储器读取到内存,使得进程可以正常访问。缺页中断处理主要包括以下几个步骤:首先,操作系统需要通过页表获取到缺失的虚拟地址所在页的页号,然后查找硬盘或其他外部存储介质,将页面读取到内存的空闲物理页框,并修改页表的映射关系。最后,重新执行导致缺页中断的指令,从而完成进程对缺失的物理页框的访问。如果内存没有足够的物理页框,操作系统需要通过页面置换算法,将一些暂时不会被使用的页替换掉,以腾出足够的物理内存空间。 以上是关于分页管理地址转换缺页中断处理的详细说明,这两个技术是确保分页管理正常运行的关键所在,也是操作系统内存管理不可或缺的组成部分。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值