package com.raylew.algorithm.os;
import java.util.Iterator;
import java.util.LinkedList;
import java.util.Scanner;
/**
* Created by [Ray Lew] on 2015/7/16
* QQ:897929321
* site:http://raylew.info
* mail:aishangzoulu@gmail.com
*/
/*
模拟位示图的主存分配算法
*/
public class MemoryManagement {
public static void main(String[] args) {
System.out.println("当前内存情况:");
Bitmap.print_arr();
Scanner scanner = new Scanner(System.in);
System.out.println("请输入作业的数量:");
int total = scanner.nextInt();// 输入作业的数量
Job[] jobs = new Job[total];
System.out.println("请输入每个作业需要的块数:");
for (int i = 0; i < jobs.length; i++) {
Job job = new Job();
int need = scanner.nextInt();
job.setNeed(need);
job.setName("作业" + i);
jobs[i] = job;
Bitmap.distribute(jobs[i]);
if (jobs[i].getSuccess() == true) {
System.out.println(jobs[i].getName() + "分配后内存的情况:");
Bitmap.print_arr(jobs[i], "f");
System.out.println();
}
}
System.out.println("请输入要回收的作业:0--" + (total - 1));
int job_index = -1;
while (job_index < 0 || job_index > (total - 1)) {
job_index = scanner.nextInt();
if (job_index < 0 || job_index > (total - 1)) {
System.out.println("输入不合格,请重新输入");
}
}
if (jobs[job_index].getSuccess() == false) {
System.out.println(jobs[job_index].getName() + "尚未分配,无法回收");
return;
}
Bitmap.callback(jobs[job_index]);
System.out.println(jobs[job_index].getName() + "回收后内存的情况:");
Bitmap.print_arr(jobs[job_index], "h");
}
}
/**
* 模拟作业
*
* @author Administrator
*/
class Job {
private String name;// 作业名
private Integer need;// 作业需要的存储区
private Boolean success;// 作业分配是否成功
private LinkedList<Integer> page_list;// 页表
public Job(String name, Integer need, LinkedList<Integer> page_list) {
super();
this.name = name;
this.need = need;
this.page_list = page_list;
}
public Job() {
page_list = new LinkedList<Integer>();
success = false;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Integer getNeed() {
return need;
}
public void setNeed(Integer need) {
this.need = need;
}
public Boolean getSuccess() {
return success;
}
public void setSuccess(Boolean success) {
this.success = success;
}
public LinkedList<Integer> getPage_list() {
return page_list;
}
public void setPage_list(LinkedList<Integer> page_list) {
this.page_list = page_list;
}
}
/**
* 模拟主存存储区
*
* @author Administrator
*/
class Bitmap {
//主存当前存储状态
private static int[][] arr = {{1, 1, 0, 0, 1, 1, 1, 0,},
{0, 1, 0, 1, 0, 1, 0, 0,}, {0, 0, 0, 0, 0, 0, 0, 0,},
{1, 0, 0, 0, 0, 0, 0, 1,}, {0, 0, 0, 0, 0, 0, 0, 0,},
{0, 0, 0, 0, 0, 0, 0, 0,}, {0, 0, 0, 0, 0, 0, 0, 0,},
{0, 0, 0, 0, 0, 0, 0, 0,}};
// 静态代码初始化count
private static int count = 0;
static {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
if (arr[i][j] == 0) {
count++;
}
}
}
}
/**
* 得到表示存储区的数组
*
* @return
*/
public static int[][] getArr() {
return arr;
}
/**
* 得到闲置的块数
*
* @return
*/
public static int getCount() {
return count;
}
/**
* 给作业分配存储区
*
* @param job 需要分配的作业
*/
public static void distribute(Job job) {
if (job.getNeed() > getCount()) {
System.out.println(job.getName() + "分配不足!");
return;
} else {
job.setSuccess(true);
System.out.print(job.getName() + "分配成功,");
}
int temp = 0;
LinkedList<Integer> page_list = job.getPage_list();
boolean isBreak = false;
for (int j = 0; j < 8; j++) {
for (int i = 0; i < 8; i++) {
if (arr[i][j] == 0) {
arr[i][j] = 1;
temp++;
count--;
page_list.add(j * 8 + i);// 将块号存入页表
}
if (temp == job.getNeed()) {
isBreak = true;
break;
}
}
if (isBreak) {
break;
}
}
System.out.println(job.getName() + "的页表如下:");
LinkedList<Integer> tmp_page_list = job.getPage_list();
System.out.println("页号 块号");
for (int i = 0; i < tmp_page_list.size(); i++) {
System.out.println(i + " " + tmp_page_list.get(i));
}
}
/**
* 回收作业使用的存储区
*
* @param job
*/
public static void callback(Job job) {
LinkedList<Integer> page_list = job.getPage_list();
for (Iterator iterator = page_list.iterator(); page_list != null
&& iterator.hasNext(); ) {
Integer integer = (Integer) iterator.next();
arr[integer % 8][integer / 8] = 0;
}
System.out.println(job.getName() + "回收完毕");
}
/**
* 打印数组
*/
public static void print_arr() {
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
System.out.print(arr[i][j] + " ");
}
System.out.println();
}
}
public static void print_arr(Job job, String mark) {
LinkedList<Integer> page_list = job.getPage_list();
for (int i = 0; i < 8; i++) {
for (int j = 0; j < 8; j++) {
boolean exist = false;
for (Iterator iterator = page_list.iterator(); iterator
.hasNext(); ) {
Integer integer = (Integer) iterator.next();
if (i == integer % 8 && j == integer / 8) {
exist = true;
break;
}
}
if (exist) {
System.out.print(arr[i][j] + mark + " ");
} else {
System.out.print(arr[i][j] + " ");
}
}
System.out.println();
}
}
}