#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. Было бы лучше, если бы вы могли расширить свой ответ и предоставить объяснение, а не просто код.