java 内存分配管理_JAVA实验操作系统内存管理-最优分配,最先分配,最坏分配算法...
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实验操作系统内存管理-最优分配,最先分配,最坏分配算法...相关推荐
- java 内存分配实例_java学习(四) —— 内存分配浅析
前言 java中有很多类型的变量.静态变量.全局变量及对象等,这些变量在java运行的时候到底是如何分配内存的呢?接下来有必要对此进行一些探究. 基本知识概念: (1)寄存器:最快的存储区, 由编译器 ...
- JAVA虚拟机 安全区域_Java虚拟机的内存区域
2020年12月10日 阅读 186 关注 Java虚拟机的内存区域 最近在看<深入理解Java虚拟机>,故此写下自己的学习笔记. JVM 运行时数据区域 Java 虚拟机在执行 Java ...
- java 内存模型面试_Java面试- JVM 内存模型讲解
经常有人会有这么一个疑惑,难道 Java 开发就一定要懂得 JVM 的原理吗?我不懂 JVM ,但我照样可以开发.确实,但如果懂得了 JVM ,可以让你在技术的这条路上走的更远一些. JVM 的重要性 ...
- 8g内存一般占用多少_8g内存开机占用一半|Windows操作系统内存使用率多少正常?...
Windows操作系统内存使用率多少正常?内存使用率根据不同用户的使用习惯和软件安装,笔者总结并模拟了一下资源占用情况,可以根据数据预测XP.Win7.Win8.Win8.1.Win10的开机资源占用 ...
- java库存信息管理系统_Java商户管理系统 客户管理 库存管理 销售报表 SSM项目源码...
系统介绍: 1.系统采用主流的 SSM 框架 jsp JSTL bootstrap html5 (PC浏览器使用) 2.springmvc +spring4.3.7+ mybaits3.3 SSM ...
- 基于java swing的系统_Java实验--基于Swing的简单的歌曲信息管理系统(三)
转载请注明出处,上一篇<Java实验--基于Swing的简单的歌曲信息管理系统(二)>介绍了项目的目录结构和Dao层,本篇主要讲解界面的绘制和业务层Service. 登录界面 登录界面设计 ...
- linux 进程管理 ppt,linux操作系统-进程管理和打印管理.ppt
<linux操作系统-进程管理和打印管理.ppt>由会员分享,可在线阅读,更多相关<linux操作系统-进程管理和打印管理.ppt(25页珍藏版)>请在装配图网上搜索. 1.进 ...
- java 线程栈空间_java线程的内存不包含在JVM堆与栈中
Java代码 publicclassMaxThreadsTest { publicstaticvoidmain(String[] args) { while(true) { newThread(n ...
- java string 内存写了_Java String的内存机制
JVM运行时,会将内存分为两个部分:堆和栈.堆中存放的是创建的对象,而栈中存放的方法调用过程的局部变量或引用.而设计Java字符串对象内存实现的时候,在堆中又开辟了一块很小的内存,称之为字符串常量池, ...
最新文章
- 从当前日期算起,获取几天前的日期和几个月前的日期
- python中xrange函数_python中xrange和range的区别
- 2021天翼杯 密码官方wp
- 彻底理解 Android 中的阴影
- Springboot高级特性——缓存
- C#5 复习总结循环 迭代和穷举
- windows安装composer总结
- 浏览器打印设置横向打印_hp打印机共享怎么设置 hp打印机共享设置方法【详解步骤】...
- ELK 把date替换为logstash的@timestamp
- 一只小野鸭的超能量(超有启发性)
- 【Spring】注解驱动开发
- mysql2008连接不上_sql server连接不上怎么办 SQL Server2008R无法登录的解决方案(1814\18456)...
- abrt-hook-ccpp占用cpu过大,使用systemctl进行关闭
- 像踢球一样玩转Redux和React
- md文件打开方式推荐
- 第12章 Stata非线性回归分析
- 爬虫 抖音用户页 所有无水印视频 批量下载 最新 (2021-3-18 可用--失效我会更新)
- 上士闻道,勤而行之,但是却得不到外界的认可, 怎么说?
- 秘密共享之算术共享、布尔共享
- 【计算机毕业设计】汽车租赁管理系统
热门文章
- [转载]总结LDO与升压芯片的选型
- python middleware_Django组件之Middleware
- 计算机控制技术试题a卷,2011年下广陵学院《计算机控制技术》考试卷(A)
- 《极客时间-许健-技术管理案例课》读书笔记
- “华为大法”对车企是“加持”还是“拖累”?
- DOSBox0.74版本安装教程(转载)
- linux 文件打洞
- 01JavaScript基础
- java计算机毕业设计校培机构的oa系统源码+数据库+系统+lw文档+mybatis+运行部署
- 编写Bash脚本获取文件夹下文件名和扩展名