package Memory;

import java.util.ArrayList;

import java.util.Iterator;

import java.util.Scanner;

public class OS {

ArrayList freeList=new ArrayList();//空闲区链表

ArrayList useList=new ArrayList();//使用区链表

Iterator freeIter,freeIter2,useIter;//使用迭代器对链表进行迭代

public OS(){//分配各分区大小

freeList.add(200d);

freeList.add(1000d);

freeList.add(1000d);

freeList.add(2048d);

freeList.add(512d);

}

public void print(){//打印当前的分区与内存信息

freeIter=freeList.iterator();//重新获取迭代器

double e=0; //用于统计总的内存大小

int j=0; //用于标记第j块分区

System.out.println("以下是剩余分区内存信息:");

while(freeIter.hasNext()){

double d=Double.parseDouble(freeIter.next().toString());

e=e+d;//统计总的内存大小

System.out.println("分区"+(j+1)+"还剩"+d+"kb大小");

j++;

}

System.out.println("总共剩下:"+e+"kb的内存大小");

useIter=useList.iterator();//迭代使用区链表

if(useIter.hasNext()==false)//如果没有正在使用的内存块

System.out.println("没有正在使用的内存块!\n");

else{

System.out.println("以下是已使用的内存块信息:");

e=0;//初始化e,用于统计总的使用区内存大小

j=1;//初始化j,用户标记第j块使用区

while(useIter.hasNext()){

double g=Double.parseDouble(useIter.next().toString());

e=e+g;

System.out.println("已使用第"+j+"块内存块的内存大小为:"+g+"kb");

j++;

}

System.out.println("总共使用了"+e+"kb大小的内存空间\n");

}

}

//最先适应分配算法

public void use1(double a){

//获取空闲区链表的迭代器

freeIter=freeList.iterator();

int i=0;//计数变量

while(freeIter.hasNext()){

double b=Double.parseDouble(freeIter.next().toString());

//从Object类型转化为double类型

//如果分区大于所需内存

if(b>=a){

freeList.remove(i);//移出链表

double c=b-a;//获得剩余内存大小,若不为空则插回链表中

if(c>0)

freeList.add(i,c);//插入原先元素的链表索引位置

useList.add(a);//添加到使用区链表中

System.out.println("*************使用最先适应分配算法:第"+(i+1)+"块分区成功分配内存"+a+"kb*************");

print();

break;

}

else

i++;//如果分区小于所需大小,循环

if(i==5){

System.out.println("*************没有足够大的分区!*************");

break;}

}

}

public void use2(double a){//最优分配算法

freeIter=freeList.iterator();//迭代空闲区

double c=-1;//用于判断分区大小与需要的内存之差

int i=-1;//用于标记最优的分区是第几块分区

int j=1;//用于标记当前分区

while(freeIter.hasNext()){ //空闲区指针所指向的对象不为空时

double

b=Double.parseDouble(freeIter.next().toString());//获取该分区大小

if((c==-1)&&(b-a)>=0){//如果还没找到合适的分区,且当前分区大于所需的内存

c=b-a;//内存之差赋值为当前分区减去所需分区

i=j;//标记当前分区

}

double d=b-a;//所剩分区大小:分区大小减去所需内存

if((d>=0)&&(d

c=d;//内存之差赋值为当前分区减去所需分区

i=j;//标记当前分区

}

if(c==0){//如果当前分区与所需的内存刚好相等,则使用当前分区,不再循环

i=j;//标记当前的分区

break;//如果分区大小与所需内存一样大,则选用此分区

}

j++;//没找到则继续循环

}

if(c<0)

System.out.println("*************没有足够大的分区!*************");

else{

freeList.remove(i-1);//移出索引标志的位置

if(c>0)//如果有剩余空间,则插回原来的位置上去

freeList.add(i-1,c);

useList.add(a);//插入使用区队列

System.out.println("*************使用最优适应分配算法:第"+i+"块分区成功分配内存"+a+"kb*************");

print();

}

}

public void use3(double a){//最坏适应分配算法

freeIter=freeList.iterator();//迭代空闲区

double c=-1;//用于判断分区大小与需要的内存之差

int i=-1;//用于标记最优的分区是第几块分区

int j=1;//用于标记当前分区

while(freeIter.hasNext()){ //空闲区指针所指向的对象不为空时

double

b=Double.parseDouble(freeIter.next().toString());//获取该分区大小

if((c==-1)&&(b-a)>=0){//如果还没找到合适的分区,且当前分区大于所需的内存

c=b-a;//内存之差赋值为当前分区减去所需分区

i=j;//标记当前分区

}

double d=b-a;//所剩分区大小:分区大小减去所需内存

if((d>=0)&&(d>c)){

//如果此分区比所需内存大且比之前的分区大,则替换为此分区,并标记索引位置

c=d;//内存之差赋值为当前分区减去所需分区

i=j;//标记当前分区

}

j++;//没找到则继续循环

}

if(c<0)

System.out.println("*************没有足够大的分区!*************");

else{

freeList.remove(i-1);//移出索引标志的位置

if(c>0)//如果有剩余空间,则插回原来的位置上去

freeList.add(i-1,c);

useList.add(a);//插入使用区队列

System.out.println("*************使用最坏适应分配算法:第"+i+"块分区成功分配内存"+a+"kb*************");

print();

}

}

public void callback(int a){//回收内存,参数为第a个内存块

double b=useList.remove(a-1);//索引位置为当前块块数减1

freeList.add(b);//内存返回到空闲区,插入到队尾

System.out.println("成功回收第"+a+"块内存");

print();

}

public void merge(int a,int b){//合并分区,传入参数为第a,b个分区

double c;

double d=0;

//判断ab大小,如果先删除索引位置小的,后面大的索引将删除不正确

if(a>b){

c=freeList.remove(a-1);//索引位置为当前分区减一

d=freeList.remove(b-1);

d=d+c;//合并分区大小

}

else{

c=freeList.remove(b-1);//索引位置为当前分区减一

d=freeList.remove(a-1);

d=d+c;//合并分区大小

}

freeList.add(d);//重新设置分区

System.out.println("成功合并第"+a+"和第"+b+"块分区");

print();

}

public void run(OS os){//控制台打印画面

while(true){

System.out.println("***********************请输入你要进行的操作***********************");

System.out.println("1.打印当前分区与内存情况\n"

+ "2.使用最先分配适应算法分配内存块\n"

+ "3.使用最优分配适应算法分配内存块 \n"

+ "4.使用最坏分配适应算法分配内存块 \n"

+ "5.回收内存块 \n"

+ "6.合并分区 \n"

+ "7.退出程序\n");

Scanner sc=new Scanner(System.in);

int a=sc.nextInt();

switch(a){

case 1:

os.print();

break;

case 2:

System.out.println("请输入你要分配的KB数:");

double b1=sc.nextDouble();

os.use1(b1);

break;

case 3:

System.out.println("请输入你要分配的KB数:");

double b2=sc.nextDouble();

os.use2(b2);

break;

case 4:

System.out.println("请输入你要分配的KB数:");

double b3=sc.nextDouble();

os.use3(b3);

break;

case 5:

System.out.println("请输入你要回收的块号:");

int c=sc.nextInt();

callback(c);

break;

case 6:

System.out.println("请输入你要回收的两个分区号");

int c2=sc.nextInt();

int c3=sc.nextInt();

os.merge(c2,c3);

break;

case 7:

System.out.println("退出程序");

System.exit(0);

default:

System.out.println("你的输入有误请重新输入!");

}

}

}

public static void main(String[] args) {

OS os=new OS();

os.run(os);

}

}

java 内存分配管理_JAVA实验操作系统内存管理-最优分配,最先分配,最坏分配算法...相关推荐

  1. java 内存分配实例_java学习(四) —— 内存分配浅析

    前言 java中有很多类型的变量.静态变量.全局变量及对象等,这些变量在java运行的时候到底是如何分配内存的呢?接下来有必要对此进行一些探究. 基本知识概念: (1)寄存器:最快的存储区, 由编译器 ...

  2. JAVA虚拟机 安全区域_Java虚拟机的内存区域

    2020年12月10日 阅读 186 关注 Java虚拟机的内存区域 最近在看<深入理解Java虚拟机>,故此写下自己的学习笔记. JVM 运行时数据区域 Java 虚拟机在执行 Java ...

  3. java 内存模型面试_Java面试- JVM 内存模型讲解

    经常有人会有这么一个疑惑,难道 Java 开发就一定要懂得 JVM 的原理吗?我不懂 JVM ,但我照样可以开发.确实,但如果懂得了 JVM ,可以让你在技术的这条路上走的更远一些. JVM 的重要性 ...

  4. 8g内存一般占用多少_8g内存开机占用一半|Windows操作系统内存使用率多少正常?...

    Windows操作系统内存使用率多少正常?内存使用率根据不同用户的使用习惯和软件安装,笔者总结并模拟了一下资源占用情况,可以根据数据预测XP.Win7.Win8.Win8.1.Win10的开机资源占用 ...

  5. java库存信息管理系统_Java商户管理系统 客户管理 库存管理 销售报表 SSM项目源码...

    系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3  SSM ...

  6. 基于java swing的系统_Java实验--基于Swing的简单的歌曲信息管理系统(三)

    转载请注明出处,上一篇<Java实验--基于Swing的简单的歌曲信息管理系统(二)>介绍了项目的目录结构和Dao层,本篇主要讲解界面的绘制和业务层Service. 登录界面 登录界面设计 ...

  7. linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt

    <linux操作系统-进程管理和打印管理.ppt>由会员分享,可在线阅读,更多相关<linux操作系统-进程管理和打印管理.ppt(25页珍藏版)>请在装配图网上搜索. 1.进 ...

  8. java 线程栈空间_java线程的内存不包含在JVM堆与栈中

    Java代码   publicclassMaxThreadsTest { publicstaticvoidmain(String[] args) { while(true) { newThread(n ...

  9. java string 内存写了_Java String的内存机制

    JVM运行时,会将内存分为两个部分:堆和栈.堆中存放的是创建的对象,而栈中存放的方法调用过程的局部变量或引用.而设计Java字符串对象内存实现的时候,在堆中又开辟了一块很小的内存,称之为字符串常量池, ...

最新文章

  1. 从当前日期算起,获取几天前的日期和几个月前的日期
  2. python中xrange函数_python中xrange和range的区别
  3. 2021天翼杯 密码官方wp
  4. 彻底理解 Android 中的阴影
  5. Springboot高级特性——缓存
  6. C#5 复习总结循环 迭代和穷举
  7. windows安装composer总结
  8. 浏览器打印设置横向打印_hp打印机共享怎么设置 hp打印机共享设置方法【详解步骤】...
  9. ELK 把date替换为logstash的@timestamp
  10. 一只小野鸭的超能量(超有启发性)
  11. 【Spring】注解驱动开发
  12. mysql2008连接不上_sql server连接不上怎么办 SQL Server2008R无法登录的解决方案(1814\18456)...
  13. abrt-hook-ccpp占用cpu过大,使用systemctl进行关闭
  14. 像踢球一样玩转Redux和React
  15. md文件打开方式推荐
  16. 第12章 Stata非线性回归分析
  17. 爬虫 抖音用户页 所有无水印视频 批量下载 最新 (2021-3-18 可用--失效我会更新)
  18. 上士闻道,勤而行之,但是却得不到外界的认可, 怎么说?
  19. 秘密共享之算术共享、布尔共享
  20. 【计算机毕业设计】汽车租赁管理系统

热门文章

  1. [转载]总结LDO与升压芯片的选型
  2. python middleware_Django组件之Middleware
  3. 计算机控制技术试题a卷,2011年下广陵学院《计算机控制技术》考试卷(A)
  4. 《极客时间-许健-技术管理案例课》读书笔记
  5. “华为大法”对车企是“加持”还是“拖累”?
  6. DOSBox0.74版本安装教程(转载)
  7. linux 文件打洞
  8. 01JavaScript基础
  9. java计算机毕业设计校培机构的oa系统源码+数据库+系统+lw文档+mybatis+运行部署
  10. 编写Bash脚本获取文件夹下文件名和扩展名