Java模拟操作系统中动态分区
来源:互联网 发布:mac的iphoto显示在哪里 编辑:程序博客网 时间:2024/04/28 07:04
【作者:孟祥月 博客:http://blog.csdn.net/mengxiangyue】
下面的代码模拟的是操作系统动态分区的过程。这里简单的介绍一下动态分区,在pc中有一定大小的内存,开始的时候这些内存都没有使用。我们可以在这个内存上去分配内存给对应的进程,这里的进程名字和进程的所需要的内存大小是我们自己输入的。我们模拟的是在内存的开始寻找能够分配给该进程的空闲区域分配给该进程,如果分配给该进程后剩余的内存小于4,那么就不在分片,而是将这个整个空闲内存,全部分配给该进程。
有分配内存,就对应的有回收内存。在某个进程运行结束之后,我们需要回收它的内存,以便后面的进程分配的时候使用。回收的时候需要注意,如果前面或者后面有空闲的内存,需要将其与回收的内存合并成为一块更大的内存。在回收内存的时候总共是八种情况。
以上就是这个程序的基本思路。
public class Data{String name;int starAddress;int length;int flag;public Data(){};public Data(String name, int starAddress, int length, int flag){this.name = name;this.starAddress = starAddress;this.length = length;this.flag = flag;}@Overridepublic String toString(){return "Data [name=" + name + ", starAddress=" + starAddress+ ", length=" + length + ", flag=" + flag + "]";}}
import java.util.ArrayList;import java.util.Scanner;public class Main{static ArrayList l = new ArrayList();static Scanner s = new Scanner(System.in);static void fenPei()//分配内存空间{Data d = new Data();System.out.println("请输入分配内存的名字");d.name = s.next();System.out.println("请输入分配内存的大小");d.length = s.nextInt();int i = 0;for(i = 0;i<l.size();i++){if(d.length<=((Data)l.get(i)).length&&((Data)l.get(i)).flag == 0)break;}if(i == l.size()){System.out.println("没有足够空间可以分配");return ;}if(((Data)l.get(i)).length - d.length<=4&&i!= l.size()-1)//不产生碎片{((Data)l.get(i)).name = d.name;((Data)l.get(i)).flag = 1;}else{d.flag = 1;((Data)l.get(i)).length -= d.length;d.starAddress = ((Data)l.get(i)).starAddress;((Data)l.get(i)).starAddress += d.length;l.add(i, d);}System.out.println("分配成功!");}static void huiShou()//回收内存空间{String name;System.out.println("请输入要回收的进程名字:");name = s.next();int i = 0; ;for(i = 0;i<l.size();i++)if(name.equals(((Data)l.get(i)).name))break;System.out.println("找到的是"+i);if(i == l.size()){System.out.println("没有当前的进程,请核对输入名字");return;}if(i == 0&&((Data)l.get(i+1)).flag ==0){((Data)l.get(i)).length += ((Data)l.get(i+1)).length;((Data)l.get(i)).flag = 0;((Data)l.get(i)).name = "";l.remove(1);}else if(i == 0&&((Data)l.get(i+1)).flag ==1){((Data)l.get(i)).name = "";((Data)l.get(i)).flag = 0;}else if(((Data)l.get(i-1)).flag == 0&&((Data)l.get(i+1)).flag ==0)//前后都是没有使用的{((Data)l.get(i-1)).length =((Data)l.get(i-1)).length + ((Data)l.get(i)).length + ((Data)l.get(i+1)).length;((Data)l.get(i-1)).name = "";l.remove(i);l.remove(i);}else if(((Data)l.get(i-1)).flag == 0&&((Data)l.get(i+1)).flag ==1)//前面未使用后面使用{((Data)l.get(i-1)).length += ((Data)l.get(i)).length;((Data)l.get(i-1)).name = "";l.remove(i);}else if(((Data)l.get(i-1)).flag == 1&&((Data)l.get(i+1)).flag ==0)//前面使用后面未使用{((Data)l.get(i)).length += ((Data)l.get(i+1)).length;((Data)l.get(i)).flag = 0;((Data)l.get(i)).name = "";l.remove(i+1);}else{((Data)l.get(i)).flag = 0;((Data)l.get(i)).name = "";}System.out.println("回收成功");}static void display(){for(int i = 0;i<l.size();i++)System.out.println(l.get(i));}public static void main(String[] args){Data d = new Data("",0,1024,0);l.add(d);int choice;while(true){System.out.println("请选择:");System.out.println("1 分配内存");System.out.println("2 回收内存");System.out.println("3 查看内存分配情况");System.out.println("4 退出 ");choice = s.nextInt();switch(choice){case 1:fenPei();break;case 2:huiShou();break;case 3:display();break;case 4:System.exit(0);default:System.out.println("输入错误请重新输入");}}}}
- Java模拟操作系统中动态分区
- 操作系统-动态分区分配模拟实验
- 【操作系统】C语言模拟操作系统实现动态分区分配算法
- 操作系统——动态分区分配方式模拟
- 操作系统_内存动态分区分配_算法模拟_JAVA
- 操作系统作业动态分区
- 【操作系统】可变分区存储管理,模拟实现
- 【操作系统总结】动态分区分配算法
- 【操作系统 - 4】动态分区分配算法
- 操作系统之动态分区分配算法
- 动态内存分区分配方式模拟
- 动态内存分区分配方式模拟[转帖]
- 动态多分区存储管理模拟系统
- OS 动态分区分配方式模拟
- 操作系统-C语言模拟固定分区储存.c
- 操作系统 模拟可变分区内存管理实验 C语言描述
- 用java实现动态分区
- 模拟java动态代理
- ASP.NET高级_2_数据源控件
- ubuntu下面玩街机+北通野牛手柄
- 有关SqlDataSource的讲解!
- 一次一密加密解密算法实现
- http://projecteuler.net/problem=2
- Java模拟操作系统中动态分区
- PHP批量删除数据
- 数据源控件
- Apache----DBUtils框架
- http://projecteuler.net/problem=3
- 线性表顺序存储结构
- 如何在GPU上产生随机数
- fork两次如何避免僵尸进程
- http://projecteuler.net/problem=4