测试用例

可变式分区分配系统:内存初始空间为640KB,起始地址从0开始编址,采用首次适应分区分配算法,对于以下进程请求,显示每次分配或回收后的内存空间情况。
  1. 进程1 申请100K
  2. 进程2 申请150K
  3. 进程3 申请300K
  4. 进程2 释放 150K
  5. 进程4 申请 80K
  6. 进程1 释放100K

代码实现

package com.zjh.dynamicPartition;import java.util.LinkedList;
import java.util.Scanner;/*** @author 张俊鸿* @description: 首次适应算法* @since 2022-05-20 16:10*/
public class FirstFit {static Scanner scanner = new Scanner(System.in);/*** 内存分区*/static class Zone{/** 大小 **/private int size;/** 初始地址 **/private int head;/** 当前状态 **/private String state;/** 作业号 **/private int num; //-1表示空闲public Zone(int size, int head, int num) {this.size = size;this.head = head;this.state = "空闲";this.num = num;}}/** 内存总大小 **/public static int memorySize;/** 空闲分区表 **/public static LinkedList<Zone> freeZones;/*** 初始化内存** @param memorySize 内存大小*/public FirstFit(int memorySize) {this.memorySize = memorySize;this.freeZones = new LinkedList<>();//向分区表加入空闲分区freeZones.add(new Zone(memorySize,0,-1));}/*** 找到第一个足够大的分区** @param size 大小* @param num  作业号*/public void findFirstFree(int size,int num) {//最佳分区的下标int index = 0;//判断是否找到boolean flag = false;//遍历寻找for (int i = 0; i < freeZones.size(); i++) {if(freeZones.get(i).state.equals("空闲") && (freeZones.get(i).size > size)){//找到足够大的了index = i;flag = true;break;}}if (flag){allocation(size,index,freeZones.get(index),num);}else {//遍历完找不到没有空闲分区System.out.println("不存在可以存放"+size+"的内存分区");}}/*** 分配内存** @param size     大小* @param index    下标* @param freeZone 空闲分区* @param num 作业号*/public void allocation(int size, int index, Zone freeZone,int num){//创建新空闲分区Zone newZone = new Zone( freeZone.size - size,freeZone.head + size,-1);freeZones.add(index + 1,newZone);//将当前分区置为占用状态freeZone.size = size;freeZone.state = "占用";freeZone.num = num;}/*** 回收分区** @param num 下标*/public void recycle(int num){Zone zone = null;int index = -1;//遍历查找for (int i = 0; i < freeZones.size(); i++) {if(freeZones.get(i).num == num){zone = freeZones.get(i);index = i;break;}}//判断是否存在该分区if(zone == null){System.out.println("请输入正确的分区号!");return;}//判断分区是否被分配if(zone.state.equals("空闲")){System.out.println("此分区是空闲分区,无需回收");return;}//判断前后分区是否是空闲的,是则进行合并boolean front = false;boolean next = false;if(index - 1 >= 0){front = freeZones.get(index - 1).state.equals("空闲");}if(index + 1 <= freeZones.size() - 1){next = freeZones.get(index + 1).state.equals("空闲");}if(front && next){//前后都是空的,直接把三个都变成一个,下标变为前一个的Zone frontZone = freeZones.get(index - 1);Zone nextZone = freeZones.get(index + 1);frontZone.size = frontZone.size + zone.size + nextZone.size;frontZone.num = -1;//移除后两个freeZones.remove(index + 1);freeZones.remove(index);}else if(front && !next){//前一个是空的,后一个不是Zone frontZone = freeZones.get(index - 1);frontZone.size = frontZone.size + zone.size;//移除freeZones.remove(index);zone.state = "空闲";zone.num = -1;}else if(!front && next){//后一个是空的,前一个不是Zone nextZone = freeZones.get(index + 1);zone.size = zone.size + nextZone.size;//移除后一个freeZones.remove(index + 1);zone.state = "空闲";zone.num = -1;}else {//前后都非空,改变该分区状态zone.state = "空闲";zone.num = -1;}System.out.println("成功回收"+zone.size+"大小的空间");}/*** 打印当前分区表*/private void printCurrent() {System.out.println("分区编号\t分区始址\t分区大小\t空闲状态\t作业号");for (int i = 0; i < freeZones.size(); i++){Zone zone = freeZones.get(i);System.out.println(i + "\t\t" + zone.head + "\t\t" +zone.size + "  \t" + zone.state+ "  \t" + (zone.num == -1 ? "": zone.num));}}public static void main(String[] args) {System.out.println("=========首次适应算法============");System.out.println("请输入初始内存总大小");int memorySize = scanner.nextInt();//初始化FirstFit firstFit = new FirstFit(memorySize);while(true) {System.out.println("请输入要分配内存还是要释放内存");System.out.println("1 分配内存 2 释放内存");int choice =scanner.nextInt();switch(choice) {case 1:{System.out.println("请输入分配内存的作业号:");int num = scanner.nextInt();System.out.println("请输入要分配的内存大小");int size = scanner.nextInt();firstFit.findFirstFree(size,num);firstFit.printCurrent();break;}case 2:{System.out.println("输入想要释放内存的作业号");int num = scanner.nextInt();firstFit.recycle(num);firstFit.printCurrent();break;}}}}
}

测试结果截图



【JAVA操作系统——可变式分区分配】首次适应算法相关推荐

  1. 7-1 内存分区分配--首次适应算法 (100 分)

    一:题目7-1 内存分区分配–首次适应算法 (100 分) 宝 今天你看我博客了吗 输入内存的大小和阈值minsize,按照首次适应算法进行连续的分区分配.在划分时,若剩余的内存小于等于minsize ...

  2. java动态分区分配算法,操作系统_动态分区分配算法课程设计_java版

    <操作系统_动态分区分配算法课程设计_java版>由会员分享,可在线阅读,更多相关<操作系统_动态分区分配算法课程设计_java版(13页珍藏版)>请在人人文库网上搜索. 1. ...

  3. 操作系统之动态分区分配与回收—C语言实现

    前言 这篇文章用来记录操作系统实验之 动态分区分配与回收. 不想从网上copy代码,打算自己从头到尾写一下,没想到却花了我整整两个晚上的时间,好在终于写完了- 动态分区分配采用的算法是最佳适应(bes ...

  4. 操作系统【动态分区分配算法——首次适应算法、最佳适应算法、最坏适应算法、临近适应算法】

    学习地址(哔哩哔哩网站--王道论坛):https://www.bilibili.com/video/BV1YE411D7nH?p=37 目录 1.首次适应算法(First Fit) 2.最佳适应算法( ...

  5. 【操作系统】-- 动态分区分配算法(首次适应算法FF、最佳适应算法BF、最坏适应算法WF、循环首次适应算法NF)

    一.首次适应算法 1.算法思想 每次从低地址开始查找,找到第一个能满足大小的空闲分区. 2.如何实现 空闲分区以地址递增的次序排列,每次分配内存时顺序查找空闲分区链,找到大小能满足要求的第一个空闲分区 ...

  6. 3.1.5 操作系统之动态分区分配的四种算法(首次适应算法、最佳适应算法、最坏适应算法、临近适应算法)

    文章目录 0.思维导图 1.首次适应算法 2.最佳适应算法 3.最坏(大)适应算法 4.临近适应算法 5.四种算法归纳比较 0.思维导图 本篇文章是对上一篇文章内存的分配与回收提到的动态分区分配算法的 ...

  7. 操作系统之 动态分区分配与回收

    算法思想: 1.分区的个数和大小不是固定不变的,而是可变的,随装入的作业动态划分,且不会产生内部碎片. 2.外部碎片: 频繁的分配与回收物理页面会导致大量的.连续且小的页面块夹杂在已分配的页面中间,就 ...

  8. 连续分配管理方式的动态分区分配算法(首次适应、最佳适应、最坏适应、邻接适应算法)

    一.动态分区分配算法(连续分配管理方式) 动态分区分配算法:在动态分区分配方式中, 当很多个空闲分区都能满足需求时,应该选择哪个分区进行分配? (一)首次适应算法 算法思想:每次都从低地址开始查找,找 ...

  9. JS实现动态分区分配中的首次适应算法和最佳适应算法

    实验目的 了解动态分区分配方式中使用的数据结构和分配算法,并进一步加深对动态分区存储管理方式及其实现过程的理解. 实验内容 (1) 用C语言(不会C这里就用JS实现)分别实现采用首次适应算法和最佳适应 ...

  10. FF首次适应算法与BF最佳适应算法(C++实现)

    [实验目的] 本实验主要练习主存的各种分配和回收.所谓分配,就是解决多道作业或多进程如何共享主存空间的问题.所谓回收,就是当作业运行完成时,将作业或进程所占用的主存空间归还给系统.主存的分配和回收的实 ...

最新文章

  1. 防静电塑料包装袋周围的静电场
  2. ansys怎么合并体_骨质增生是由什么原因造成的?膝盖骨质增生是怎么造成的?...
  3. 使用Nomad构建弹性基础架构: 作业生命周期
  4. monitor.go
  5. Thrift使用指南
  6. java 集合 CopyOnWriteArrayList
  7. javascript基础修炼(4)——UMD规范的代码推演
  8. 数据结构之栈的应用:括号匹配问题
  9. mysql kegg_阿里技术官甩出的768页MySQL优化笔记,火遍全网不是意外
  10. 创建ASP.NET Core MVC应用程序(3)-基于Entity Framework Core(Code First)创建MySQL数据库表
  11. ARM给服务器厂商更多创新机会
  12. 【日常记录】CTF审查清单(windows)
  13. 美团外卖订单系统演进
  14. WiFi连接过程简要分析
  15. Abaqus 空间管路 自动化建模与分析
  16. u盘插上电脑显示计算机无响应,为什么u盘连接电脑没反应,u盘在电脑上显示不出来...
  17. java定义一个生日类_java定义一个学生类,学生类的数据成员有姓名,学号,出生日期,专业,提供两个以上的...
  18. JVM深入学习(十六)-垃圾回收器的分类和性能指标
  19. c++的*号是否有空格的区别以及char*转std::vector<float>解析
  20. PAMI19 - 强大的级联RCNN架构《Cascade R-CNN: High Quality Object Detection and Instance Segmentation》

热门文章

  1. 寒霜朋克计算机丢失,寒霜朋克停止工作怎么办 寒霜朋克停止工作解决方法
  2. CTabSheet类源码
  3. 2011微软MVP全球峰会美国行之飞抵西雅图
  4. 北京内推 | 微软亚洲研究院机器学习组招聘AI4Science实习研究员
  5. 论物理学与技术革命之间的关系
  6. JS匹配域名的正则表达式
  7. All-Pay Contests 论文定理推导(博弈论+机制设计)
  8. python统计元音字母个数_Quzh[python]统计元音字母——输入一个字符串,统计处其中元音字母的数量。...
  9. 自己开计算机维修,自己维修笔记本电脑
  10. 再见了, 达叔!我用Python回顾一代喜剧大师203部作品,太经典了!