import java.util.Arrays;
class Node{
int id;
int initSize = 0;
int endSize = 0;
int usedSize = 0;
int freeSize = 255;
Node next = null;
public Node(){}
public Node(int id,int initSize, int endSize) {
this.initSize = initSize;
this.endSize = endSize;
this.id = id;
}
public void setNext(Node next) {
this.next = next;
}
public Node getNext() {
return next;
}
public void display() {
System.out.println("内存块id:" + id +" 起始地址:" + initSize + " 尾地址:" + endSize + " 已使用内存大小:" + usedSize
+ " 剩余内存大小:" + freeSize);
}
}
class FreeLinkedList{
public Node head;//定义头指针
public int length = 0;//初始长度为0
public FreeLinkedList(){
this.head = null;//创建一个空表
}
public void printAllNode(){
Node cur = head;
while (cur != null){
cur.display();
cur = cur.getNext();
}
System.out.println();
}
public void insertList(int index,int InitSize,int endSize){
Node newNode = new Node(length,InitSize,endSize);
if(head == null){
head = newNode;
length++;
return;
}
if(index == 1){
head.setNext(newNode);
}
else {
Node preNode = head;
int count = 1;
while (count<index){
preNode = preNode.getNext();
count++;
}
Node curNode = preNode.getNext();
newNode.setNext(curNode);
preNode.setNext(newNode);
}
length++;
}
}
public class Main {
static FreeLinkedList freeLinkedList = InitList();
static FreeLinkedList InitList(){
FreeLinkedList freeLinkedList = new FreeLinkedList();
for (int i = 0; i < 4; i++) {
freeLinkedList.insertList(i,256*i,(256*i+256)-1);
}
return freeLinkedList;
}
static void Distribute(FreeLinkedList linkedList,int size){
Node nowNode = linkedList.head;
Node curNode = linkedList.head;
int[] res = new int[4];
int min = 10000;
while (curNode!=null){
if(curNode.freeSize>=size&&curNode.freeSize-size<min){
res[curNode.id] = curNode.freeSize-size;
}
curNode = curNode.getNext();
}
int flag = 0;
for (int i = 0; i < res.length; i++) {
if(res[i]<=min&&res[i]>0){
min = res[i];
flag = i;
}
}
while (nowNode!=null){
if(nowNode.id==flag){
if(nowNode.freeSize==size){
nowNode.usedSize += size;
nowNode.freeSize = 0;
}else if(nowNode.freeSize>size&&(nowNode.freeSize-size)/2<1){
nowNode.usedSize = 256;
nowNode.freeSize = 0;
}else if(nowNode.freeSize>size){
nowNode.usedSize += size;
nowNode.freeSize -= size;
}else {
System.out.println("failed");
return;
}
}
nowNode = nowNode.getNext();
}
linkedList.printAllNode();
System.out.println("succeed");
}
public static void main(String[] args){
Distribute(freeLinkedList,30);
Distribute(freeLinkedList,200);
Distribute(freeLinkedList,50);
}
}
内存空间管理的动态分区(基于javaSE)
最新推荐文章于 2023-12-18 12:50:47 发布