模拟实现内存动态分区分配与回收(完整代码)

2023-11-08

memory类:

package memory;
import java.util.LinkedList;
import java.util.Scanner;

public class memory {
        private int size;//内存大小
        private static final int MIN_SIZE =3;//最小剩余分区大小
        private LinkedList<Partition> mpartition;//内存分区
        private int location;//上次分配的空闲区位置

        class Partition{//分区节点类
            private int size;//分区大小
            private int head;//分区始址
            private boolean Free;//空闲状态

            public Partition(int head, int size) {
                this.head = head;
                this.size = size;
                this.Free = true;
            }
        }


        public memory(){
            this.size = 100;//默认内存大小为 100 KB
            this.location = 0;//默认上次分配的空闲区位置为0
            this.mpartition = new LinkedList<>();
            mpartition.add(new Partition(0, size));
        }
        public memory(int size) {
            this.size = size;
            this.location = 0;
            this.mpartition = new LinkedList<>();
            mpartition.add(new Partition(0, size));
        }

        //内存分配
        // size 指定需要分配的大小
        public void allocation(int size){
            System.out.println("1.首次适应算法\n2.循环首次适应算法\n3.最佳适应算法\n4.最坏适应算法");
            System.out.print("请您选择内存分配算法:");
            Scanner in = new Scanner(System.in);
            int input = in.nextInt();
            switch (input){
                case 1:
                    FristFit(size);break;
                case 2:
                    NextFit(size);break;
                case 3:
                    BestFit(size);break;
                case 4:
                    WorstFit(size);break;
                default:
                    System.out.println("请您重新选择!");
            }
        }


        //首次适应算法
        //size 指定需要分配的大小
        private void FristFit(int size){
            //遍历分区链表
            for (location = 0; location < mpartition.size(); location++){//每次从链首开始查找
                Partition temp =mpartition.get(location);
                if (temp.Free && (temp.size > size)){//找到可用空闲分区且大小足够
                    Distribute(size, location, temp);
                    return;
                }
            }
            //遍历结束后未找到可用分区, 则内存分配失败
            System.out.println("无可用内存空间!");
        }


      //循环首次适应算法
      // size 指定需要分配的大小
        private void NextFit(int size){
            Partition temp = mpartition.get(location);//从上次分配的空闲区位置开始遍历分区链表
            if (temp.Free && (temp.size > size)){
                Distribute(size, location, temp);
                return;
            }
            int length= mpartition.size();
            int i = (location + 1) % length;
            for (; i != location; i = (i+1) % length){
                temp = mpartition.get(i);
                //找到可用分区(空闲且大小足够)
                if (temp.Free && (temp.size > size)){
                    Distribute(size, i, temp);
                    return;
                }
            }
            //遍历结束后未找到可用分区, 则内存分配失败
            System.out.println("无可用内存空间!");
        }


         // 最佳适应算法
         //size 指定需要分配的大小
        private void BestFit(int size){
            int flag = -1;
            int min = this.size;
            for (location = 0; location < mpartition.size(); location++){
                Partition temp = mpartition.get(location);
                if (temp.Free && (temp.size > size)){
                    if (min > temp.size - size){
                        min = temp.size - size;
                        flag = location;
                    }
                }
            }
            if (flag == -1){
                System.out.println("无可用内存空间!");
            }else {
                Distribute(size, flag, mpartition.get(flag));
            }
        }


         //最坏适应算法
         //size 指定需要分配的大小
        private void WorstFit(int size){
            int flag = -1;
            int max = 0;
            for (location= 0; location < mpartition.size(); location++){
                Partition temp = mpartition.get(location);
                if (temp.Free && (temp.size > size)){
                    if (max < temp.size - size){
                        max = temp.size - size;
                        flag = location;
                    }
                }
            }
            if (flag == -1){
                System.out.println("无可用内存空间!");
            }else {
                Distribute(size, flag, mpartition.get(flag));
            }
        }

        //执行分配函数,size 申请大小,location 当前可用分区位置,temp 可用空闲区
        private void Distribute(int size, int location, Partition temp) {
            //如果分割后分区剩余大小过小(MIN_SIZE)则将分区全部分配,否则分割为两个分区
            if (temp.size - size <= MIN_SIZE){
                temp.Free = false;
            } else {
                Partition split = new Partition(temp.head + size, temp.size - size);
                mpartition.add(location + 1, split);
                temp.size = size;
                temp.Free = false;
            }
            System.out.println("成功分配 " + size + "KB 的内存!");
        }

         //内存回收,id 指定要回收的分区号
        public void collection(int id){
            if (id >= mpartition.size()){
                System.out.println("没有此分区号!");
                return;
            }
            Partition temp = mpartition.get(id);
            int size = temp.size;
            if (temp.Free) {
                System.out.println("分区未被分配, 无需回收");
                return;
            }
            //如果回收分区不是尾分区且后一个分区为空闲, 则与后一个分区合并(上不邻下邻或者上下都邻)
            if (id < mpartition.size() - 1 && mpartition.get(id + 1).Free){
                Partition next = mpartition.get(id + 1);
                temp.size += next.size;
                mpartition.remove(next);
            }
            //如果回收分区不是首分区且前一个分区为空闲, 则与前一个分区合并(上邻下不邻或者上下都邻)
            if (id > 0 && mpartition.get(id - 1).Free){
                Partition previous = mpartition.get(id - 1);
                previous.size += temp.size;
                mpartition.remove(id);
                id--;
            }
            mpartition.get(id).Free = true;
            System.out.println("内存回收成功!, 本次回收了 " + size + "KB 空间!");
        }

        //展示内存分区状况
        public void showmpartition(){
            System.out.println("*****************************************");
            System.out.println("分区编号\t分区始址\t分区大小\t空闲状态\t");
            for (int i = 0; i < mpartition.size(); i++){
                Partition temp = mpartition.get(i);
                System.out.println(i + "\t\t\t" + temp.head + "\t\t\t" +
                        temp.size + "\t\t\t" + temp.Free);
            }
            System.out.println("*****************************************");
        }
    }


主函数:main类

package main;
import java.util.Scanner;
import memory.memory;

public class main {
        public static void main(String[] args) {
            memory memory = null;
            Scanner in = new Scanner(System.in);
            System.out.print("请初始化内存大小:");
            int size = in.nextInt();
            memory = new memory(size);
            memory.showmpartition();
            while (true){
                System.out.println("1.申请分配空间\n2.回收已分配空间\n3.显示分区状况");
                System.out.print("请选择指令:");
                size = in.nextInt();
                switch (size) {
                    case 1:
                        System.out.print("请输入需要申请的空间大小:");
                        size = in.nextInt();
                        memory.allocation(size);
                        break;
                    case 2:
                        System.out.print("请输入需要回收的分区号:");
                        size = in.nextInt();
                        memory.collection(size);
                        break;
                    case 3:
                        memory.showmpartition();
                        break;
                    default:
                        System.out.println("请重新选择!");
                }
            }
        }
    }


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

模拟实现内存动态分区分配与回收(完整代码) 的相关文章

  • 计算机技能应用大赛Java

    GO GO GO 大家好 我是你们的晴天学长 这是Java初赛考试范围知识点的快速链接 请自取哦 各位小伙伴觉得有帮助的话 可以给博主来波关注哦 考试范围 Java基础及环境 JDK发展历史 不同版本的进阶内容 Java程序的编写 编译 调
  • Unbuntu 20.4 配置RTX2080ti环境

    具体配置 显卡驱动460 cuda 11 0 3 450 51 06 linux run cudnn 11 3 linux x64 v8 2 1 32 Tensirflow 1 13 1 python 3 6 亲测有效
  • 微服务Ribbon在docker中无法通过服务名(SERVICE-ID)映射到宿主机IP

    I O error on GET request for http API ADMIN microservice 1 280d0f4200d8 nested exception isjava net UnknownHostException
  • Ubuntu操作系统学习笔记之FTP基础

    说明 FTP File Transfer Protocol 一个 古老但应用极为广泛 的互联网协议 FTP提供了一种可靠的方式在网络上进行文件共享 C S 架构 基于 TCP 提供了数据传输的可靠性 标准端口 20 数据端口 21 指令端口
  • 并发编程面试题汇总

    并发编程面试题 1 创建线程的方式有哪些 1 1继承 Thread 类 1 2实现 Runnable 接口 1 3实现 Callable 接口 1 4使用 Executors 工具类创建线程池 1 5使用 ThreadPoolExecuto
  • Sqli-labs Less8

    Sqli labs Less8 1 判断注入点 根据回显不同 存在单引号闭合注入点 可以尝试布尔盲注 2 判断字段 根据order by判断 字段数为3 3 爆破数据库 1 and length database 8 判断数据库名字的长度
  • 数据结构与算法【整理版】

    目录 数据结构 数据结构中查找 插入 删除分析 数组 链表 链表的创建代码 利用哨兵简化实现难度 删除链表中的倒数第N个结点 合并两个有序链表 141 环形链表 https leetcode cn com problems linked l
  • 【Unity-Cinemachine相机】虚拟相机旋转Composer属性详解

    Look At和Aim本质是控制虚拟相机自身的旋转 并不一定非要看着 或者并不一定非要瞄着这里的游戏对象 Look At和Aim是以Look At里面的对象作为参考来旋转自身 Do nothing 表现出来的行为和Look At空出来一样
  • iOS 应用测试总结

    在历代机型上的测试 主屏幕上的图标和程序名称显示是否正确 观察UI是否符合设计 多任务并存的情况下 测试app的流畅性 当前app的声音播放功能是否在拔出耳机后自动暂停 播放器类app或者有播放功能的app对各种格式文件的支持 播放视频时
  • 数据库JDBC(Java DataBase Connectivity)-->三层架构

    可以使用JDBC完成数据库的访问 java程序不能直接访问到某个具体的数据库 这种强耦合的方式不符合开闭原则 JDBC都是接口 具体JDBC的实现由数据库厂商来实现 将来数据库发生变化 只需要更改驱动 模拟数据库连接 通过反射创建对象 加载
  • 在Linux平台的CUDA cublas矩阵乘具体实现及编译过程

    文章目录 环境变量配置 代码 编译过程 结果 环境变量配置 vim bashrc 最后一行添加cublas v2所在的目录 export CPLUS INCLUDE PATH CPLUS INCLUDE PATH usr local cud
  • 从ChatGPT看人工智能

    ChatGPT是2022年出来的一个对话型人工智能 ChatGPT就是这样一种可以和人类用自然语言去交流的人工智能 一上线就引发了恐慌 最厉害的地方还是它能够用人类的语言来进行交流 不管是中文 英文 日文都可以 ChatGPT有可能就是传说
  • nuxt项目中引入ant design vue的less文件报错.bezierEasingMixin()

    最近使用nuxt 2 14 0版本当中使用 ant desgin vue 这个UI框架进行定制主题 首先 在nuxt项目当中的assets文件夹当中创建less文件夹 在less文件夹下创建index less和variable less文
  • 怎样在webpack中使用 art-template 模板引擎, art-template详解

    1 简介 art template是一个简约 执行速度超快的模板引擎 它采用作用域声明的技术来优化模板渲染速度 从而获得接近 Javascript 极限的运行性能 并且同时支持 NodeJs和浏览器 使用art template 便于代码的
  • linux cpu 内存爆满 mysql停止_每个程序员都应该知道的 CPU 知识:NUMA

    什么是 NUMA 早期的计算机 内存控制器还没有整合进 CPU 所有的内存访问都需要经过北桥芯片来完成 如下图所示 CPU 通过前端总线 FSB Front Side Bus 连接到北桥芯片 然后北桥芯片连接到内存 内存控制器集成在北桥芯片
  • 基于机器学习的油田产油量产量预测 AdaBoost、xgboost、lightgbm 完整代码数据 可直接运行

    项目讲解 基于机器学习 knn 逻辑回归 决策树 集成学习 adaboost梯度提升树 SVC xgboost的工业产量预测数据分析可视化 哔哩哔哩 bilibili 基于机器学习XGB svm LGBM knn的 from sklearn
  • Profiling Top Kagglers: Bestfitting, Currently #1 in the World

    We have a new 1 on our leaderboard a competitor who surprisingly joined the platform just two years ago Shubin Dai bette
  • 研究下DFD

    数据流图 简称DFD 是SA方法中用于表示系统逻辑模型的一种工具 它以图形的方式描绘数据在系统中流动和处理的过程 由于它只反映系统必须完成的逻辑功能 所以它是一种功能模型 下图是一个飞机机票预订系统的数据流图 它反映的功能是 旅行社把预订机
  • JAVA学习------打印多种星星矩阵

    打印一个10 10的星星矩阵 package step1 public class ForPractice1 public static void test start for int i 1 i lt 10 i for int j 1 j
  • [网络安全提高篇] 一一六.恶意代码同源分析及BinDiff软件基础用法

    网络安全提高班 新的100篇文章即将开启 包括Web渗透 内网渗透 靶场搭建 CVE复现 攻击溯源 实战及CTF总结 它将更加聚焦 更加深入 也是作者的慢慢成长史 换专业确实挺难的 Web渗透也是块硬骨头 但我也试试 看看自己未来四年究竟能

随机推荐

  • warning: remember to run ‘libtool --finish /usr/local/1/php-7.4.29/libs

    ubuntu上php7 4 33编译安装完成后警告报错 如下所示 usr local apache2 apr build 1 libtool finish usr local soft php 7 4 33 libs vim etc ld
  • C++:打印大写字母对应的ASCII码

    题目描述 输出26个大写字母对应的ASCII码 每输出 个ASCII码换一行再输出下一行 输入 输出 输出 个十进制整数 即对应大写字母的ASCII码 输出格式见样例 样例输入 Copy 样例输出 Copy 65 66 67 68 69 7
  • Docker学习进阶篇

    学自狂神 视频地址 https www bilibili com video BV1kv411q7Qc share source copy web 目标 掌握 docker基础 原理 网络 服务 集群 错误排查 日志 linux docke
  • java处理时间字符串2021-08-04T16:00:00.000Z

    背景 业务中收到了字符串2021 08 04T16 00 00 000Z 也有可能是2021 08 05 或者2021 08 05 12 00 00由于不确定性 需要手动转换时间 直接上代码 public static String int
  • 在webpack中使用monaco-editor

    目录 前言 使用 自己总结的使用过程 1 安装 2 在页面中使用 3 开启辅助功能 4 如何设置菜单中文显示效果 5 编辑器功能 6 monaco editor使用到的JS文件如何压缩 2020年4月28日11 49 58 前言 我查过网上
  • ROS中多个工作空间同时工作

    ROS开发中 有时需要建多个工作空间 将不同的功能包区别开来 但是 多个工作空间会存在相互影响的情况 如何让它们能同时工作且相互不影响 需要技巧 这里需要清楚ROS工作空间的工作原理 本文做个详细介绍 1 ROS PACKAGE PATH环
  • 汽配企业如何把MES管理系统的价值利用到最大化

    随着信息技术的快速发展 越来越多的汽配企业开始引入MES生产管理系统 以提高生产效率 优化资源利用和提升产品质量 然而 要想实现MES系统的最大化价值 汽配企业需要从以下几个方面入手 首先 汽配企业应该充分了解MES系统的功能和特点 并根据
  • git笔记

    git笔记 第一次使用配置 git config global user email you example com git config global user name Your Name 生成ssh key ssh keygen t
  • Matplotlib Intermediate Styling with cycler

    Styling with cycler 自定义属性循环设置的演示以控制多个 line 的图的颜色和其他样式属性 这个例子演示了两种不同的 API 设置 rc 参数 指定默认属性循环 这会影响所有随后的 axes 不会影响已经创建的 axes
  • 论文笔记:Learning Transferable Visual Models From Natural Language Supervision(CLIP)

    1 Intro 目前最先进的CV模型 大部分是现有一个定义好的类别的集合 然后模型通过预测这些提前定义好的类别 从而完成模型的训练 这些提前定义好的类别会大大简化问题本身 但采用了这种有限制性的监督信号 也大大限制了模型的泛化性 尤其是识别
  • 详解Python的切片(Slice)

    先看例子 array 0 1 2 3 4 5 print array print array 1 print array 2 print array 4 1 print array 4 5 print array 10 3 结果是 0 1
  • Ubuntu 12.04 搭建Android开发环境

    Ubuntu 12 04 搭建Android开发环境 2013 7 29 Linux环境下搭建Android开发环境 大部分开发人员可能都在Windows下做开发 可能是感觉在Windows下比较方便 我感觉也是 不过作为一名开发者仅局限在
  • R语言内置颜色色板+生成代码

    R语言内置颜色参照色板 日常使用中 想用一些R语言内置颜色 网上始终没有找到相对齐全的内置色板 于是自己写了一个 R语言内置颜色总共657种 文中代码共生成560种颜色 去掉了部分Grey渐变色 代码如下 RColors 568 col l
  • spring文件上传大小限制,Springboot大于一1G文件上传

    前言 一 SpringMVC简介 1 1 SpringMVC引言 为了使Spring有可插入的MVC架构 SpringFrameWork在Spring基础上开发SpringMVC框架 从而在使用Spring进行WEB开发时可以选择使用Spr
  • 宋浩线性代数笔记(六)二次型

    本章的内容比较少且均通俗易懂 较第三章和第五章容易许多 之后还有针对于数学一的第7更 数二数三的选手已经可以完结撒花
  • Dagger2 设计模式之构建者模式

    Dagger 中的设计模式分析 Builder 模式 DaggerFatherComponent 对象的构建 Dagger 中对 DaggerFatherComponent 对象的构建可以拆分成三部分 一 构建使用 Inject 注解构造函
  • ARMV8体系结构简介:AArch64应用级体系结构之Atomicity

    1 前言 Atomicity是内存访问的一个属性 描述为原子性访问 包括single copy atomicity和multi copy atomicity 2 基本概念 observer 可以发起对memory read write访问的
  • 经典机器学习算法之SVM算法

    本篇文章旨在让完全不懂的小伙伴对该算法有一个初步认识与理解 只适用于小白 如果想深入了解 可以参考本文的参考文章 文章目录 一 算法介绍 1 SVM简介 2 支持向量 二 算法分析 1 线性可分情况 线性可分的理解 找到最优的超平面 2 线
  • 【第四阶段】kotlin语言中的数组类型

    1 kotlin语言中的数组类型 类型 定义 IntArray intArrayOf DoubleArray doubleArrayOf LongArray longArrayOf ShortArray shortArrayOf ByteA
  • 模拟实现内存动态分区分配与回收(完整代码)

    memory类 package memory import java util LinkedList import java util Scanner public class memory private int size 内存大小 pr