package dsg;
import java.io.*;
import java.util.*;
public class aaa {
private static BufferedReader cin=new BufferedReader(new InputStreamReader(System.in));
private static BufferedWriter cout=new BufferedWriter(new OutputStreamWriter(System.out));
private static int pID=1;
private static class Partition{
String Name;
int ID;
int start;
int size;
char state='F';
public Partition(String Name,int ID, int start, int size) {
this.Name=Name;
this.ID = ID;
this.start = start;
this.size = size;
}
}
public static LinkedList<Partition> partitions=new LinkedList<>();
public static int init() throws IOException {
System.out.println("请输入要分配的内存大小和内存名称");
String[] str=cin.readLine().split(" ");
int size=Integer.parseInt(str[0]);
String Name=str[1];
partitions.add(new Partition(Name,pID++,0,size));
System.out.println("请输入要用的算法,1为BF,2为FF,3为WF");
str=cin.readLine().split(" ");
int choose=Integer.parseInt(str[0]);
display();
return choose;
}
public static void display(){
System.out.println("------------------------------------");
System.out.println("ID\t名称\t分区大小\t起始地址\t结束地址\t状态");
for(Partition p:partitions){
if(p.state=='F') System.out.println(p.ID+"\t"+p.Name+'\t'+p.size+"\t\t"+
p.start+"\t\t"+(p.start+p.size-1)+"\t\t空闲");
if(p.state=='B') System.out.println(p.ID+"\t"+p.Name+'\t'+p.size+"\t\t"+
p.start+"\t\t"+(p.start+p.size-1)+"\t\t占用");
}
System.out.println("------------------------------------");
}
public static boolean check(int size,String Name){//size为要申请的空间
Partition t;
for(Partition p:partitions){
if(p.Name.equals(Name)) {
System.out.println("已存在同名作业");
return false;
}
}
for(Partition p:partitions){
if(p.size>=size&&p.state=='F'){
t=new Partition(Name,pID++,p.start,size);
t.state='B';
p.size-=size;
p.start+=size;
partitions.add(t);
Collections.sort(partitions, new Comparator<Partition>() {
@Override
public int compare(Partition t0, Partition t1) {
return t0.start-t1.start;
}
});
return true;
}
}
return false;
}
public static void allocate(int i) throws Exception{
System.out.println("输入申请空间的大小和作业名称");
String[] str=cin.readLine().split(" ");
int size=Integer.parseInt(str[0]);
String Name=str[1];
Partition p=null;
boolean Full=false;
if(i==1){//BF
Collections.sort(partitions, new Comparator<Partition>() {
@Override
public int compare(Partition t0, Partition t1) {
return t1.size-t0.size;
}
});
}
else if(i==2){//FF
Collections.sort(partitions, new Comparator<Partition>() {
@Override
public int compare(Partition t0, Partition t1) {
return t0.start-t1.start;
}
});
}
else if(i==3){//WF
Collections.sort(partitions, new Comparator<Partition>() {
@Override
public int compare(Partition t0, Partition t1) {
return t0.size-t1.size;
}
});
}
else System.out.println("输入无效");
boolean check=check(size,Name);
if(!check) System.out.println("或没有足够的空间分配");
}
public static void merge(){
Collections.sort(partitions, Comparator.comparingInt(o -> o.start));
int index=1;
for(Partition p:partitions){
p.ID=index++;//重新编号
}
for(int i=0;i< partitions.size()-1;i++){
if(partitions.get(i).state=='F'&&partitions.get(i+1).state=='F'){
partitions.get(i).size+=partitions.get(i+1).size;
partitions.remove(i);
i=0;
}
}
}
public static void free() throws IOException {
System.out.println("输入要释放的作业名称");
Collections.sort(partitions, Comparator.comparingInt(o -> o.start));
String Name=cin.readLine().split(" ")[0];
boolean isFind=false;
//Partition aim=null;
for(Partition p:partitions){
if(!p.Name.equals("A")&&p.state=='F') {
p.Name="@";
}
}
for(Partition p:partitions){
if(Name.equals(p.Name)&&p.state=='B') {
isFind=true;
break;
}
}
if(!isFind) {
System.out.println("没有这个作业或该空间为空闲");
return;
}
//存在
int index=1;
for(Partition p:partitions){
p.ID=index++;//重新编号
}
int aim = 0;
for(Partition p:partitions){
if(p.Name.equals(Name)) {
aim=p.ID;
p.state='F';//先释放
p.Name="A";
break;
}
}
int pre=aim-1,next=aim+1;
/*if(pre>0&&partitions.get(pre-1).state=='F'){
//前一个存在且空闲
partitions.get(aim-1).size= partitions.get(aim-1).size+partitions.get(pre-1).size;
partitions.get(aim-1).start=partitions.get(pre-1).start;
partitions.remove(pre-1);
}
//display();
if(next<= partitions.size()&&partitions.get(next-1).state=='F'){
//后一个存在且空闲
partitions.get(next-1).size= partitions.get(aim-1).size+partitions.get(next-1).size;
partitions.get(next-1).start=partitions.get(aim-1).start;
partitions.remove(aim-1);
}*/
merge();
for(Partition p:partitions){
if(p.Name.equals(Name)) {
aim=p.ID;
p.state='F';//先释放
p.Name="A";
break;
}
}
int cntA=0;
int cnt=0;
for(Partition p:partitions){
if(p.Name.equals("A")) {
cntA++;
}
else cnt++;
}
if(cntA>1&&cnt==0) {
merge();
}
}
public static void main(String[] args) throws Exception{
int choose=init();
while(true){
System.out.println("1.安排作业");
System.out.println("2.取消作业并回收内存");
System.out.println("3.查看当前状态");
System.out.println("4.退出");
switch (Integer.parseInt(cin.readLine().split(" ")[0])) {
case 1:
//System.out.println("请选择算法,1为BF,2为FF,3为WF");
allocate(choose);
display();
break;
case 2:
free();
break;
case 3:
display();
break;
case 4: return;
}
}
}
}