Реализация выделения и освобождения пространства памяти с использованием связанного списка

#java #memory #memory-management #linked-list

#java #память #управление памятью #связанный список

Вопрос:

Это вопрос домашнего задания в отношении реализации управления памятью с использованием связанных списков. Каждый процесс памяти запрашивает определенный объем памяти, который должен быть достаточно большим, чтобы вместить память, а затем выделить процесс.Когда задание завершается, его разрешенная память становится свободной. Вот мой Java-код для этого:

  public class PartitionNode{
    int beginAddress;
    int endAddress;
    boolean holeFree;
    int processId;
    PartitionNode next;

public PartitionNode(int begin,int end){
     beginAddress=begin;
     endAddress=end;
     holeFree=true;
     processId=-1;
     next=null;


}

public PartitionNode(){}
public PartitionNode(int begin,int end,int i){
    beginAddress=begin;
    endAddress=end;
    holeFree=false;
    processId=i;

}
 

}

 public class Partition{
    private  PartitionNode head;
    public PartitionNode current;

public  int begin;
public int end;
public PartitionNode newPartition;
private Partition(int beginAddress,int endAddress){
    head=new PartitionNode(beginAddress,endAddress);
    begin=beginAddress;
    end=endAddress;
    current=head;
}

public void addProcess(int size,int id){
    if((current.endAddress-current.beginAddress>=size)amp;amp; current.holeFree==true){
        newPartition=new PartitionNode(current.beginAddress,current.beginAddress size-1,id);
        current.next=newPartition;
        newPartition.next=refresh();

        System.out.println("beginAddress" newPartition.beginAddress);
        System.out.println("endAddress" newPartition.endAddress);

    }

}

 public void print(){
    PartitionNode temp=head;


    while(temp.next!=null){
        System.out.println(temp.processId);
        temp=temp.next;
    }
 }


public   PartitionNode refresh(){
    current=new PartitionNode(newPartition.endAddress 1,end);
        return current;

}
public void deleteProcess(int process){
    PartitionNode temp=head;
    PartitionNode temp2=head;

    while(temp.next!=null){
        if(temp.processId==process){

            temp2.next=temp.next;
            break;
        }
        temp2=temp;
        temp=temp.next;
    }

}



public static void main (String args[]){
    Partition p=new Partition(300,3000);
    p.addProcess(500,1);

    p.addProcess(800,2);

    p.addProcess(400,3);
    p.deleteProcess(2);
    p.print();


}


}
 

Если я выполняю процессы как

  • Выделить P1 500k
  • Выделить P2 800k
  • Выделить P3 400k
  • Завершение работы P2
  • Выделить P4 100k

согласно моему коду, для P4 будет выделено 100 кб места в пределах оставшегося пространства 1700-3000 (при условии, что общий объем памяти равен 3000 КБ), хотя пространство, ранее размещенное P2, теперь свободно, и поэтому P4 может быть включен в пространство более раннего p2.

Как я могу заставить его работать так, чтобы P4 был добавлен к теперь свободному пространству P2

Комментарии:

1. Я предлагаю вам использовать отладчик и / или распечатывать состояние раздела после каждой операции. Это покажет вам, где вы ошибаетесь.

Ответ №1:

Ваш метод deleteProcess удаляет ссылку на объект PartitionNode, который вы хотите удалить, что позволяет сборщику мусора освободить память. Однако сборщик мусора Java не гарантирует, что это произойдет немедленно или в течение установленного периода времени после удаления всех ссылок на объект.

Для вас это означает, что память не освобождается, и вы не можете контролировать, когда это произойдет.

Надеюсь, я понял ваш вопрос, и это поможет.

Ответ №2:

Прежде чем добавить новый слот в конец списка ссылок, вы должны выполнить поиск свободного слота. Обратитесь к «searchSlotAndInsert», где мы ищем бесплатный слот.

Попробуйте использовать приведенный ниже код:

     public class Partition {
        private PartitionNode head;
        public PartitionNode current;

        public int begin;
        public int end;
        public PartitionNode newPartition;

        private Partition(int beginAddress, int endAddress) {
            head = new PartitionNode(beginAddress, endAddress);
            begin = beginAddress;
            end = endAddress;
            current = head;
        }

        public void addProcess(int size, int id) {
            boolean isProcessInserted = searchSlotAndInsert(size, id); 
            if (!isProcessInserted amp;amp; (current.endAddress - current.beginAddress >= size)
                    amp;amp; current.holeFree == true) {
                newPartition = new PartitionNode(current.beginAddress,
                        current.beginAddress   size - 1, id);
                current.next = newPartition;
                newPartition.next = refresh();
            } 
        }

        public void print() {
            PartitionNode temp = head;
            while (temp.next != null) {
                System.out.println(temp.next.processId);
                temp = temp.next.next;
            }
        }

        public PartitionNode refresh() {
            current = new PartitionNode(newPartition.endAddress   1, end);
            return current;
        }

        public void deleteProcess(int process) {
            PartitionNode temp = head;
            PartitionNode temp2 = head;
            while (temp.next != null) {
                if (temp.processId == process) {
                    temp2.next = temp.next.next;
                    if(temp2.next == null){
                        current = temp2;
                    }
                    break;
                }
                temp2 = temp;
                temp = temp.next;
            }
        }
//Search for free slot
        public boolean searchSlotAndInsert(int size, int id){
            PartitionNode temp2 = head;
            PartitionNode temp = head.next;
            while (temp != null) {
                if (temp2.beginAddress != temp.beginAddress) {
                    break;
                }
                temp2 = temp.next;
                temp = temp.next.next;
            } 
            if(temp != null amp;amp; temp.beginAddress-temp2.beginAddress >= size){
                PartitionNode newPartition1 = new PartitionNode(temp2.beginAddress,
                        temp2.beginAddress   size - 1, id);
                temp2.next = newPartition1;
                PartitionNode temp3 = new PartitionNode(newPartition1.endAddress   1, end);
                newPartition1.next = temp3;
                temp3.next = temp;
                return true;
            }
            return false;
        }

        public static void main(String args[]) {
            Partition p = new Partition(300, 4000);
            p.addProcess(500, 1);
            p.addProcess(800, 2);
            p.addProcess(400, 3);
            p.deleteProcess(2);
            p.deleteProcess(3);
            p.addProcess(1100, 4);
            p.addProcess(800, 5);
            p.addProcess(100, 6);
            p.deleteProcess(1);
            p.deleteProcess(5);
            p.deleteProcess(6);
            p.addProcess(900, 7);
            p.addProcess(100, 8);
            p.addProcess(500, 9);
            p.print();
        }
    }
 

Комментарии:

1. Привет, добро пожаловать в StackOverflow. Было бы лучше, если бы вы могли расширить свой ответ и предоставить объяснение, а не просто код.