//进程类封装
package pers.jintao.firstfit;
public class Progress {
private int size;
private String name;
public Progress() {
}
public Progress(int size,String name) {
this.size=size;
this.name=name;
}
public int getSize() {
return this.size;
}
public void setSize(int size) {
this.size=size;
}
public String getName() {
return this.name;
}
public void setName(String name) {
this.name=name;
}
}
//空闲分区封装
package pers.jintao.firstfit;
public class Partition {
private int size;
private int residualSize;
private String progress;
public Partition() {
size=0;
residualSize=0;
}
public Partition(int size,int residualSize,String progress) {
this.size=size;
this.residualSize=residualSize;
this.progress=progress;
}
public int getSize() {
return this.size;
}
public int getResidualSize() {
return this.residualSize;
}
public String getProgress() {
return this.progress;
}
public void setSize(int size) {
this.size=size;
}
public void setResidualSize(int residualSize) {
this.residualSize=residualSize;
}
public void setProgress(String progress){
this.progress+=progress;
}
}
//首次适应算法
package pers.jintao.firstfit;
import java.util.ArrayList;
import java.util.Scanner;
public class FirstFit {
public static void main(String[] args) {
int partitionNum = 0; //空闲分区数
int progressNum =0; //进程数
boolean isEnd= false; //初始化完成标志
int flag=0; //空闲分区操作标志
int flag2=-1; //进程操作标志
ArrayList<Partition> arryPartition=new ArrayList<Partition>();
ArrayList<Progress> arryProgress=new ArrayList<Progress>();
Scanner sc=new Scanner(System.in);
while(!isEnd){
//空闲分区初始化
if(flag==0) {
System.out.print("输入空闲分区数");
partitionNum=sc.nextInt();
flag++;
}
else if(flag2==-1){
System.out.print("输入空闲分区"+flag+"大小");
int size=sc.nextInt();
Partition par=new Partition(size,size,"");
arryPartition.add(par);
flag++;
if(flag==partitionNum+1) {
flag2++;
}
}
//进程初始化
else if(flag2==0) {
System.out.print("输入进程数");
progressNum=sc.nextInt();
flag2++;
}
else {
System.out.print("输入进程"+flag2+"名称、大小");
String name =sc.next();
int size=sc.nextInt();
Progress pro=new Progress(size,name);
arryProgress.add(pro);
flag2++;
if(flag2==progressNum+1) {
isEnd=true;
}
}
}
sc.close();
for(int i=0;i< progressNum;i++) {
for(int j=0;j<partitionNum;) {
if(arryProgress.get(i).getSize()<=arryPartition.get(j).getResidualSize()) {
arryPartition.get(j).setProgress(arryProgress.get(i).getName());
arryPartition.get(j).setResidualSize(arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize());
break;
}
j++;
if(j==partitionNum) {
System.out.println(arryProgress.get(i).getName()+"无法分配");
}
}
}
System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
for(int i=0;i<arryPartition.size();i++) {
System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
}
}
}
//循环首次适应算法
package pers.jintao.nextfit;
import java.util.ArrayList;
import java.util.Scanner;
import pers.jintao.firstfit.Partition;
import pers.jintao.firstfit.Progress;
public class NextFit {
public static void main(String[] args) {
int partitionNum = 0; //空闲分区数
int progressNum =0; //进程数
boolean isEnd= false; //初始化完成标志
int flag=0; //空闲分区操作标志
int flag2=-1; //进程操作标志
ArrayList<Partition> arryPartition=new ArrayList<Partition>();
ArrayList<Progress> arryProgress=new ArrayList<Progress>();
Scanner sc=new Scanner(System.in);
while(!isEnd){
//空闲分区初始化
if(flag==0) {
System.out.print("输入空闲分区数");
partitionNum=sc.nextInt();
flag++;
}
else if(flag2==-1){
System.out.print("输入空闲分区"+flag+"大小");
int size=sc.nextInt();
Partition par=new Partition(size,size,"");
arryPartition.add(par);
flag++;
if(flag==partitionNum+1) {
flag2++;
}
}
//进程初始化
else if(flag2==0) {
System.out.print("输入进程数");
progressNum=sc.nextInt();
flag2++;
}
else {
System.out.print("输入进程"+flag2+"名称、大小");
String name =sc.next();
int size=sc.nextInt();
Progress pro=new Progress(size,name);
arryProgress.add(pro);
flag2++;
if(flag2==progressNum+1) {
isEnd=true;
}
}
}
sc.close();
int progressFlag=0;
for(int i=0;i< progressNum;i++) {
for(int j=0;j<partitionNum;) {
int num=progressFlag % partitionNum;
if(arryProgress.get(i).getSize()<=arryPartition.get(num).getResidualSize()) {
arryPartition.get(num).setProgress(arryProgress.get(i).getName());
arryPartition.get(num).setResidualSize(arryPartition.get(num).getResidualSize()-arryProgress.get(i).getSize());
break;
}
progressFlag++;
j++;
if(j==partitionNum) {
System.out.println(arryProgress.get(i).getName()+"无法分配");
}
}
}
System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
for(int i=0;i<arryPartition.size();i++) {
System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
}
}
}
//最佳适应算法
package pers.jintao.bestfit;
import java.util.ArrayList;
import java.util.Scanner;
import pers.jintao.firstfit.Partition;
import pers.jintao.firstfit.Progress;
public class BestFit {
public static void main(String[] args) {
int partitionNum = 0; //空闲分区数
int progressNum =0; //进程数
boolean isEnd= false; //初始化完成标志
int flag=0; //空闲分区操作标志
int flag2=-1; //进程操作标志
ArrayList<Partition> arryPartition=new ArrayList<Partition>();
ArrayList<Progress> arryProgress=new ArrayList<Progress>();
Scanner sc=new Scanner(System.in);
while(!isEnd){
//空闲分区初始化
if(flag==0) {
System.out.print("输入空闲分区数");
partitionNum=sc.nextInt();
flag++;
}
else if(flag2==-1){
System.out.print("输入空闲分区"+flag+"大小");
int size=sc.nextInt();
Partition par=new Partition(size,size,"");
arryPartition.add(par);
flag++;
if(flag==partitionNum+1) {
flag2++;
}
}
//进程初始化
else if(flag2==0) {
System.out.print("输入进程数");
progressNum=sc.nextInt();
flag2++;
}
else {
System.out.print("输入进程"+flag2+"名称、大小");
String name =sc.next();
int size=sc.nextInt();
Progress pro=new Progress(size,name);
arryProgress.add(pro);
flag2++;
if(flag2==progressNum+1) {
isEnd=true;
}
}
}
sc.close();
for(int i=0;i< progressNum;i++) {
int size=999;
int num=0;
for(int j=0;j<partitionNum;) {
if(arryProgress.get(i).getSize()<=arryPartition.get(j).getResidualSize()&&size>arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize()) {
size=arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize();
num=j;
}
j++;
if(j==partitionNum) {
if(size!=arryPartition.get(num).getResidualSize()-arryProgress.get(i).getSize()) {
System.out.println(arryProgress.get(i).getName()+"无法分配");
}
else {
arryPartition.get(num).setProgress(arryProgress.get(i).getName());
arryPartition.get(num).setResidualSize(size);
}
}
}
}
System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
for(int i=0;i<arryPartition.size();i++) {
System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
}
}
}
//最坏适应算法
package pers.jintao.worstfit;
import java.util.ArrayList;
import java.util.Scanner;
import pers.jintao.firstfit.Partition;
import pers.jintao.firstfit.Progress;
public class WorstFit {
public static void main(String[] args) {
int partitionNum = 0; //空闲分区数
int progressNum =0; //进程数
boolean isEnd= false; //初始化完成标志
int flag=0; //空闲分区操作标志
int flag2=-1; //进程操作标志
ArrayList<Partition> arryPartition=new ArrayList<Partition>();
ArrayList<Progress> arryProgress=new ArrayList<Progress>();
Scanner sc=new Scanner(System.in);
while(!isEnd){
//空闲分区初始化
if(flag==0) {
System.out.print("输入空闲分区数");
partitionNum=sc.nextInt();
flag++;
}
else if(flag2==-1){
System.out.print("输入空闲分区"+flag+"大小");
int size=sc.nextInt();
Partition par=new Partition(size,size,"");
arryPartition.add(par);
flag++;
if(flag==partitionNum+1) {
flag2++;
}
}
//进程初始化
else if(flag2==0) {
System.out.print("输入进程数");
progressNum=sc.nextInt();
flag2++;
}
else {
System.out.print("输入进程"+flag2+"名称、大小");
String name =sc.next();
int size=sc.nextInt();
Progress pro=new Progress(size,name);
arryProgress.add(pro);
flag2++;
if(flag2==progressNum+1) {
isEnd=true;
}
}
}
sc.close();
for(int i=0;i< progressNum;i++) {
int size=0;
int num=0;
for(int j=0;j<partitionNum;) {
if(arryProgress.get(i).getSize()<=arryPartition.get(j).getResidualSize()&&size<arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize()) {
size=arryPartition.get(j).getResidualSize()-arryProgress.get(i).getSize();
num=j;
}
j++;
if(j==partitionNum) {
if(size!=arryPartition.get(num).getResidualSize()-arryProgress.get(i).getSize()) {
System.out.println(arryProgress.get(i).getName()+"无法分配");
}
else {
arryPartition.get(num).setProgress(arryProgress.get(i).getName());
arryPartition.get(num).setResidualSize(size);
}
}
}
}
System.out.println("分配后分区大小"+'\t'+"分配进程"+'\t');
for(int i=0;i<arryPartition.size();i++) {
System.out.println(""+arryPartition.get(i).getResidualSize()+'\t'+'\t'+arryPartition.get(i).getProgress()+'\t');
}
}
}