操作系统 java模拟主存储器空间的分配和回收

2023-10-26

实验原理

模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收。
(1)可变分区方式是按作业需要的主存空间大小来分割分区的。当要装入一个作业时,根据作业需要的主存量查看是否有足够的空闲空间,若有,则按需要量分割一个分区分配给该作业;若无,则作业不能装入。随着作业的装入、撤离,主存空间被分成许多个分区,有的分区被作业占用,而有的分区是空闲的。例如:

在这里插入图片描述

为了说明哪些区是空闲的,可以用来装入新作业,必须要有一张空闲区说明表,格式如下:

在这里插入图片描述

其中,起址——指出一个空闲区的主存起始地址。
长度——指出从起始地址开始的一个连续空闲的长度。
状态——有两种状态,一种是“未分配”状态,指出对应的由起址指出的某个长度的区域是空闲区。

(2) 当有一个新作业要求装入主存时,必须查空闲区说明表,从中找出一个足够大的空闲区。有时找到的空闲区可能大于作业需要量,这时应把原来的空闲区变成两部分:一部分分给作业占用;另一部分又成为一个较小的空闲区。为了尽量减少由于分割造成的空闲区,而尽量保存高地址部分有较大的连续空闲区域,以利于大型作业的装入。为此,在空闲区说明表中,把每个空闲区按其地址顺序登记,即每个后继的空闲区其起始地址总是比前者大。

(3) 采用最先适应算法(顺序分配算法)分配主存空间。
按照作业的需要量,查空闲区说明表,顺序查看登记栏,找到第一个能满足要求的空闲区。当空闲区大于需要量时,一部分用来装入作业,另一部分仍为空闲区登记在空闲区说明表中。
由于本实验是模拟主存的分配,所以把主存区分配给作业后并不实际启动装入程序装入作业,而用输出“分配情况”来代替。

(4) 当一个作业执行结束撤离时,作业所占的区域应该归还,归还的区域如果与其它空闲区相邻,则应合成一个较大的空闲区,登记在空闲区说明表中。

(5) 请按最先适应算法设计主存分配和回收的程序。假设初始时主存中没有作业,现按下面序列进行内存的申请与释放:
作业1申请300K,作业2申请100K,作业1释放300K,作业3申请150K,
作业4申请30K, 作业5申请40K, 作业6申请60K, 作业4释放30K。
请你为它们进行主存分配和回收,把空闲区说明表的初值以及每次分配或回收后的变化显示出来或打印出来。

算法流程图

在这里插入图片描述
图一.内存分配流程图

在这里插入图片描述

          图二.内存回收流程图

代码

package System.Neicun;

import java.util.ArrayList;
import java.util.LinkedList;
import java.util.List;

public class Mermory {
    int szie=512;    //内存空间大小初始值
    public List<Node> freeMerroyList=new LinkedList<>();   //内存分配表


    public void print(String str){
        System.out.println("----------"+str+"---------");
        int i;
        System.out.println("起址:"+0+"    大小(长度):"+freeMerroyList.get(0).start+"    状态:"+true);
            for(i=0;i<freeMerroyList.size()-1;i++){
                Node now=freeMerroyList.get(i);
                Node next=freeMerroyList.get(i+1);
                System.out.println("起址:"+now.start+"    大小(长度):"+now.size+"    状态:"+now.state);
                System.out.println("起址:"+now.end+"    大小(长度):"+(next.start-now.end)+"    状态:"+true);
            }
        Node now=freeMerroyList.get(i);
        System.out.println("起址:"+now.start+"    大小(长度):"+now.size+"    状态:"+now.state);

    }

    public void Allocate(Node jobnode){   //分配函数
        int i;
          for(i=0;i<freeMerroyList.size();i++){
              Node merroyNode=freeMerroyList.get(i);
              if(jobnode.size<merroyNode.size&&merroyNode.state==false){   //如果可以分配下,且未分配,则分配此块内存
                  jobnode.setJobBound(merroyNode.start);
                  merroyNode.size-=jobnode.size;
                  merroyNode.start+=jobnode.size;
                  break;
              }
        }
          if(i==freeMerroyList.size()){   //未找到,分配失败
              System.out.println("分配失败");
              return;
          }
    }


    public void back(Node jobnode){    //回收函数
        int i;
        Node merrroyNode=new Node();
        if(jobnode.start>freeMerroyList.get(freeMerroyList.size()-1).end){    //如果作业的起始地址在最后一个空闲节点之后,直接插入
            Node newfreeNode=new Node(jobnode.start,jobnode.size,false);
            freeMerroyList.add(newfreeNode);
            return;
        }else if(jobnode.start==freeMerroyList.get(freeMerroyList.size()-1).end){  //如果作业的起始地址与最后一个空闲节点的末尾相等,直接合并
            freeMerroyList.get(freeMerroyList.size()-1).uPadteMerroyNodeEnd(jobnode.size);
            return;
        }

        for(i=0;i<freeMerroyList.size();i++){   //找寻中间点
            merrroyNode=freeMerroyList.get(i);
            if(jobnode.start>=merrroyNode.end&&merrroyNode.state==false){
                break;
            }
        }

        Node next=freeMerroyList.get(i+1);
        if(jobnode.start==merrroyNode.end&&next.start>jobnode.end){  //前面相邻
            merrroyNode.uPadteMerroyNodeEnd(jobnode.size);
            return;
        }else if(jobnode.start>merrroyNode.end&&jobnode.end==next.start){  //后面相邻
            merrroyNode.uPadteMerroyNodeStart(jobnode.start);
            return;
        }else if(jobnode.start==merrroyNode.end&&jobnode.end==next.start){  //前后相邻
            merrroyNode.uPadteMerroyNodeEnd(jobnode.size);
            freeMerroyList.remove(next);
            return;
        }

        Node newFreeNode=new Node(jobnode.start,jobnode.size,false);  //中间插入
        freeMerroyList.add(i+1,newFreeNode);
    }

    public void init(){  //初始化
        Node node1=new Node(14,12,false);   //初始时,系统的空闲分区表
        Node node2=new Node(32,500,false);
        freeMerroyList.add(node1);
        freeMerroyList.add(node2);
    }

    public Mermory(){
        init();
    }

    public static void main(String[] args) {
        Mermory mermory=new Mermory();
        Node jobNode1=new Node(300);
        mermory.print("初始空闲表");
        mermory.Allocate(jobNode1);
        mermory.print("作业一申请300k空间,分配后");

        Node jobNode2=new Node(100);
        mermory.Allocate(jobNode2);
        mermory.print("作业二申请100k空间,分配后");

        mermory.back(jobNode1);
        mermory.print("作业一回收后");


        Node jobNode3=new Node(150);
        mermory.Allocate(jobNode3);
        mermory.print("作业三申请150k空间,分配后");

        Node jobNode4=new Node(30);
        mermory.Allocate(jobNode4);
        mermory.print("作业四申请30k空间,分配后");

        Node jobNode5=new Node(40);
        mermory.Allocate(jobNode5);
        mermory.print("作业五申请40k空间,分配后");

        Node jobNode6=new Node(60);
        mermory.Allocate(jobNode6);
        mermory.print("作业六申请60k空间,分配后");

        mermory.back(jobNode4);
        mermory.print("作业四释放后");
    }


}


class Node{
    int start;  //起始
    int size;   //大小
    boolean state;   //状态
    int end;    //结束地址
    public Node(){

    }
    public Node(int size) {    //作业申请节点
        this.state=true;
        this.size = size;
    }

    public Node(int start, int size, boolean state) {   //空闲节点
        this.start = start;
        this.size = size;
        this.state = state;
        this.end=start+size;
    }

   public void setJobBound(int start){
        this.start=start;
        this.end=start+this.size;
   }

   public void uPadteMerroyNodeEnd(int size){
        this.size+=size;
        this.end+=size;
   }
    public void uPadteMerroyNodeStart(int size){
        this.size+=size;
        this.start-=size;
    }
    public void print(String str){
        System.out.println(str+" 起始:"+start+"  大小:"+size+"   终止:"+end);
    }
}

结果

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

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

操作系统 java模拟主存储器空间的分配和回收 的相关文章

  • 如何将TabLayout与Recyclerview同步?

    我有一个TabLayout with Recyclerview这样当单击选项卡时Recyclerview滚动到特定位置 我也想要相反的过程 这样当Recyclerview滚动到特定位置 然后该特定选项卡会突出显示 例如 如果有 4 个选项卡
  • 生成固定长度的随机数组[重复]

    这个问题在这里已经有答案了 我只是想更改我的代码 以便每次运行代码时都会生成固定长度 100 个整数的随机数组 而不仅仅是在代码中包含一个预先设置的数组 我对此很陌生 所以只需要正确方向的指导 谢谢 public class Selecti
  • Spring MVC 配置启用

    我正在从头开始建立一个项目 目前我正在配置Spring MVC 4 1 5使用java配置 整个应用程序正在 tomcat gradle 插件上运行 有人可以解释一下为什么我需要对班级进行以下调用DefaultServletHandlerC
  • 创建 CXF Web 服务客户端时出现 ServiceConstructionException (scala+java+wsdl2java)

    这些其他问题暗示了解决方案 但我无法让它发挥作用 无法解析 http schemas xmlsoap org wsdl soap 的绑定 https stackoverflow com questions 26159206 could no
  • 包java.time不存在,jdk1.8

    嗯 我刚刚开始从事代号工作 我对 Java 有相当不错的经验 我的代码一切都很好 没有任何问题 但在编译时我得到了这个 error package java time does not exit import java time Local
  • 当服务器仅从请求中读取标头时,Http 客户端未收到响应

    我在 Java 中搞乱了 HTTP 和套接字 希望你能对此有所了解 当我用 Java SE 11 编写的 HTTP 服务器没有读取整个请求然后响应时 客户端不会收到它或收到错误 这是为什么 在服务器读取整个请求之前 客户端是否无法读取响应
  • 从 Java 监听系统鼠标点击

    我的主要目的是计算特定应用程序上的鼠标点击次数 想象一下 我在 PC 上打开了 Microsoft Word 和 Web 浏览器 我的 Java 代码应该告诉我单击 Word 和 Web 浏览器的次数 我需要应用程序名称和点击次数 我怎样才
  • Hamcrest 与 MockMvc:检查键是否存在,但值可能为空

    我正在使用 MockMvc 进行一些测试 我想验证 JSON 响应的结构 具体来说 我想确保属性的键存在 并且值是某种类型或为 null keyToNull null This may be null or a String keyToSt
  • Spring框架中的DAO和Service层到底是什么?

    Spring框架中的DAO和Service层到底是什么 我正在寻找理论答案 就 Spring 而言 没有区别 按照惯例 您可以使用以下方式标记 DAO 类 Repository和服务 Service 前者还进行一些持久层异常转换 既然您在理
  • 尽管设置为 1.7,IntelliJ IDEA 13 仍使用 Java 1.5

    尽管在所有项目设置中指定了 JDK 1 7 包括File gt Project Structure gt Project Project SDK 则产生以下错误IntelliJ 13当尝试编译一些使用菱形运算符的简单 Java 7 代码时
  • 谷歌gson LinkedTreeMap类转换为myclass

    我知道这个问题以前已经被问过 由于我对java和android的新手技能 我一个多星期都无法解决这个问题 我和我的一位朋友正在开发一个 Android 项目 其中有一些类似的事情 最奇怪的部分是 只有当我从 Google Play 商店下载
  • 在 Eclipse 中编写链接特定行的注释

    我正在 Java 中使用 Eclipse 并且处理很长的类 我需要这样的功能 在方法的顶部注释中 例如 有一个由该方法执行的操作列表 对于列出的每个操作 我想将注释的一部分 超链接 到相关代码的特定行 然后使用 Ctrl Click 到该行
  • JPA Criteria API 任意数量的联接/子查询

    我需要使用以下实体构建相交类型查询 为了清楚起见 减少了实体 Entity and other stuff public class Member Id private Long id private String name Entity
  • 如何将 HTML 转换为保留换行符的文本

    我如何将 HTML 转换为保留换行符的文本 由 br p div 等元素生成 可能使用NekoHTML http nekohtml sourceforge net 或任何足够好的 HTML 解析器 Example Hello br Worl
  • 如何反序列化数组 google-gson 内的数组

    我有这样的 JSON Answers Locale Ru Name Name1 Locale En Name Name2 Locale Ru Name Name3 Locale En Name Name4 正如你所看到的 我的数组里面有数组
  • JToolBar 放回 GridBagLayout 时出现 IllegalArgumentException

    为什么这段代码会抛出一个IllegalArgumentException当工具栏被拖离 GUI 然后关闭 将其返回到 GUI 时 我可以理解为什么在没有约束的情况下添加组件可能是不合适的 但在这种情况下 工具栏最初添加到面板 使用GridB
  • 三角形未在 OSX 上的 OpenGL 2.1 中绘制

    我正在学习有关使用 OpenGL 在 Java 中创建游戏引擎的教程 我正在尝试在屏幕上渲染一个三角形 一切运行良好 我可以更改背景颜色 但三角形不会显示 我还尝试运行作为教程系列的一部分提供的代码 但它仍然不起作用 教程链接 http b
  • 使用 Java 8 时间将时间从一个时区转换为另一时区

    我正在尝试将日期转换为GMT 5 30 to EST与java 8ZonedDateTime String inputDate 2015 04 30 13 00 DateTimeFormatter sourceFormatter DateT
  • 如何使用 GWT 2.4 在服务器端动态创建 UI

    我正在尝试使用 Google Web Toolkit v2 4 创建用户界面 由于多种原因 我需要在运行时指定服务器上接口的内容 我的意思不仅仅是按钮需要动态标签等 而是整个 UI 需要在运行时创建 我的大部分 UI 都可以指定为直接的 H
  • Oracle 的商业 Hotspot JVM 相对于 OpenJDK 有哪些性能优势?

    正如这个问题中所描述的 OpenJDK 与 Java HotspotVM https stackoverflow com q 44335605 1593077 Oracle 的商业 Hotspot JVM 本质上是 OpenJDK 加上一些

随机推荐

  • 差分方程与滤波的实现

    1 滤波基础知识 2 差分方程 3 IIR滤波器 1 直接I型IIR滤波器 2 直接II型IIR滤波器
  • 备战2023蓝桥国赛-移动服务

    题目描述 解析 这道题我想复杂了 一开始我是这样想的 设dp i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位置的情况下的最小花费 state i j 表示按顺序满足到第i个请求时 最初在j号点的人到达第i个请求的位
  • Typescript 之接口 interface(详解)

    一 interface的基本含义 TS新增了一个重要概念 接口 分为对象类型接口和函数类型接口 接口可以约束对象 函数 类的结构和类型 是一种代码协作必须遵守的契约 Interface 是一种描述对象或函数的东西 你可以把它理解为形状 一个
  • 使用github免费搭建个人博客后的写作及上传说明

    项目地址 我的博客github项目地址 个人博客网站 欢迎进入我的博客 本篇文章介绍如何在博客搭建好的基础上 使用它 使用它来写博客 更新博客页面 第一种方法 本地编辑 上传到github 首先 从我的github个人博客项目仓库克隆出该工
  • vscode中CommandNotFoundError: Your shell has not been properly configured to use ‘conda active的可能解决方法

    一 问题背景 如题 出现该问题后 我首先通过搜索尝试了conda init 用管理员身份运行powershell进行权限配置等方法无果 python之 vscode中激活conda虚拟环境报错或者打开虚拟环境失败 if using cond
  • 滑动时间窗口的思想和实现,环形数组,golang

    固定时间窗口 在开发限流组件的时候 我们需要统计一个时间区间内的请求数 比如以分钟为单位 所谓固定时间窗口 就是根据时间函数得到当前请求落在哪个分钟之内 我们在统计的时候只关注当前分钟之内的数量 即 0s 60s 因为流量并不是均匀的 所以
  • 微软RIA服务2009年7月预览版官方手册第2节(翻译:戴石麟)

    2 理解N层Silverlight应用项目 微软 NET RIA服务通过结合ASP NET和Silverlight平台来简化传统N层应用模式 应用逻辑写在中间层上 通过查询 更新 定制方法和服务操作来控制对数据的访问 NET RIA服务特性
  • Verilog入门学习笔记:Verilog基础语法梳理

    无论是学IC设计还是FPGA开发 Verilog都是最基本 最重要的必备技能 但任何一门编程语言的掌握都需要长期学习 并不是简简单单的随便读几本书 随便动动脑筋那么简单 Verilog是一门基于硬件的独特语言 由于它最终所实现的数字电路 具
  • netstat详解

    netstat是控制台命令 是一个监控TCP IP网络的非常有用的工具 它可以显示路由表 实际的网络连接以及每一个网络接口设备的状态信息 netstat可以用于显示与IP TCP UDP和ICMP协议相关的统计数据 一般用于检验本机各端口的
  • vb wor转存html,利用VB操作WORD的基本方法

    利用VB操作WORD的基本方法 通过查阅资料 自我实践 经实验通过 先引用word Application Dim MyWord As Word Application Dim MyWordBook As Word Document Set
  • Numpy:基础数据结构

    1 数组的基本属性 import numpy as np ar np array 1 2 3 4 5 6 7 print ar 输出数组 注意数组的格式 中括号 元素之间没有逗号 和列表区分 print ar ndim 输出数组维度的个数
  • Python @函数装饰器及用法(超级详细)转

    Python 内置的 3 种函数装饰器 分别是 staticmethod classmethod 和 property 其中 staticmethod classmethod 和 property 都是 Python 的内置函数 那么 我们
  • layui子弹框调用父弹框方法

    var thisFrame parent window document getElementById LAY layuiStampDuty1 getElementsByTagName iframe 0 id 获取父级弹框id值 var d
  • 【20220412】文献翻译4:交互中的手势和语言概述

    Gesture and speech in interaction An overview 1 简介 2 什么是共同语言 同声传译 手势 2 1 用手比划 2 2 用头做动作 3 语音和手势是交互的 3 1 交际环境中的手势 3 2 传递意
  • 双向链表

    双向就意味着对于每一个元素 都有两个方向的指向 因此从以下几个方面阐述双向链表 重要方法分析 全部代码 一 重要方法分析 这里的链表实现了我博客中的接口 ILinkedList 与结点 LinkedNode 具体的博客地址 http blo
  • 【Linux】VIM使用

    第一节 Vim常用操作 Vim没有菜单 只有命令 Vim的工作模式有三种 第一种 命令模式 vi vim 文件名 进入命令模式 不可以输入文字 只能识别命令 插入命令 a 在光标所在字符后插入 i 在光标所在字符前插入 o 在光标下插入新行
  • Vue基础精讲 —— Vue的组件之组件的定义、继承、自定义双向绑定、高级属性

    Vue组件基础定义 import Vue from vue const compoent props active type Boolean required true validator value return typeof value
  • UE4-蓝图基础:TimeLine

    一 概念 1 TimeLine 在一定时间内不断执行的一个蓝图节点 2 添加一个空白节点 函数讲解 Play 事件驱动 执行此事件时调用 Play from Start 从头开始执行事件 lt 事件在执行过程中未执行完毕 某一条件改变 事件
  • 回路电感详细介绍(环路电感)

    相比于硬件工程师 PCB工程师对环路电感更敏感 因为环路电感和走线强相关 不管是信号完整性还是电源完整性都涉及到这个概念 一旦电路结构确定 环路电感也随之确定 如果环路电感初期评估失误将会给后期改版带来巨大风险 更多资料请关注公众号 工程师
  • 操作系统 java模拟主存储器空间的分配和回收

    文章目录 实验原理 算法流程图 代码 结果 实验原理 模拟在可变分区管理方式下采用最先适应算法实现主存分配和回收 1 可变分区方式是按作业需要的主存空间大小来分割分区的 当要装入一个作业时 根据作业需要的主存量查看是否有足够的空闲空间 若有