内存分配java最佳适应算法
时间: 2023-11-28 18:45:42 浏览: 53
以下是Java中最佳适应算法的内存分配示例:
```java
import java.util.ArrayList;
import java.util.Collections;
import java.util.Comparator;
public class Memory {
private int size;
private int fragment;
private String algType;
private ArrayList<Area> freeAreaList;
private ArrayList<Area> usedAreaList;
public Memory(int size, int fragment, String algType) {
this.size = size;
this.fragment = fragment;
this.algType = algType;
this.freeAreaList = new ArrayList();
this.usedAreaList = new ArrayList();
this.freeAreaList.add(new Area(0, size));
}
public void allocate(int id, int size) {
if (algType.equals("best")) {
Collections.sort(freeAreaList, new Comparator<Area>() {
@Override
public int compare(Area o1, Area o2) {
return o1.getSize() - o2.getSize(); }
});
} else if (algType.equals("worst")) {
Collections.sort(freeAreaList, new Comparator<Area>() {
@Override
public int compare(Area o1, Area o2) {
return o2.getSize() - o1.getSize();
}
});
}
for (int i = 0; i < freeAreaList.size(); i++) {
Area area = freeAreaList.get(i);
if (area.getSize() >= size) {
usedAreaList.add(new Area(id, area.getStart(), size));
area.setStart(area.getStart() + size);
area.setSize(area.getSize() - size);
if (area.getSize() == 0) {
freeAreaList.remove(i);
}
if (area.getSize() < fragment) {
fragment++;
}
return;
}
}
}
public void free(int id) {
for (int i = 0; i < usedAreaList.size(); i++) {
Area area = usedAreaList.get(i);
if (area.getId() == id) {
usedAreaList.remove(i);
freeAreaList.add(area);
Collections.sort(freeAreaList, new Comparator<Area>() {
@Override
public int compare(Area o1, Area o2) {
return o1.getStart() - o2.getStart();
}
});
mergeFreeArea();
return;
}
}
}
private void mergeFreeArea() {
for (int i = 0; i < freeAreaList.size() - 1; i++) {
Area area1 = freeAreaList.get(i);
Area area2 = freeAreaList.get(i + 1);
if (area1.getStart() + area1.getSize() == area2.getStart()) {
area1.setSize(area1.getSize() + area2.getSize());
freeAreaList.remove(i + 1);
i--;
}
}
}
public void display() {
System.out.println("Memory size: " + size);
System.out.println("Fragment size: " + fragment);
System.out.println("Algorithm type: " + algType);
System.out.println("Free area list:");
for (Area area : freeAreaList) {
System.out.println(area);
}
System.out.println("Used area list:");
for (Area area : usedAreaList) {
System.out.println(area);
}
}
public static void main(String[] args) {
Memory memory = new Memory(100, 5, "best");
memory.allocate(1, 20);
memory.allocate(2, 30);
memory.allocate(3, 10);
memory.free(2);
memory.allocate(4, 15);
memory.display();
}
}
class Area {
private int id;
private int start;
private int size;
public Area(int id, int start, int size) {
this.id = id;
this.start = start;
this.size = size;
}
public Area(int start, int size) {
this.start = start;
this.size = size;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public int getStart() {
return start;
}
public void setStart(int start) {
this.start = start;
}
public int getSize() {
return size;
}
public void setSize(int size) {
this.size = size;
}
@Override
public String toString() {
return "Area{" +
"id=" + id +
", start=" + start +
", size=" + size +
'}';
}
}
```