Groups | Search | Server Info | Login | Register


Groups > de.sci.informatik.misc > #370

Re: Freispeichermanagement

From Stefan Reuther <stefan.news@arcor.de>
Newsgroups de.sci.informatik.misc
Subject Re: Freispeichermanagement
Date 2022-12-14 19:55 +0100
Message-ID <tnd9n5.5gc.1@stefan.msgid.phost.de> (permalink)
References <jvr0o1Fdr6vU1@mid.individual.net> <tnag8q.4to.1@stefan.msgid.phost.de> <jvs1hhFin2bU4@mid.individual.net>

Show all headers | View raw


Am 13.12.2022 um 20:19 schrieb Andreas Wagner:
> Am 13.12.2022 um 18:28 schrieb Stefan Reuther:
>> Ich würde versuchen, die Verwaltungsdaten in den Blöcken selbst zu
>> speichern. Ein allokierter Block besteht aus Header+Payload, ein
>> freigegebener Block besteht aus Header+Knoten1+Knoten2, wobei Knoten1/2
>> die Knoten in der ersten und zweiten Map sind. Die Basisoperationen sind
>> dann nicht store() und remove(), sondern insertNode() und unlinkNode(),
>> die einfach nur den Knoten ein- oder ausketten und dabei keine neuen
>> Knoten anlegen.
> 
> Meinst Du bei "Header+Knoten1+Knoten2", dass jeweils Speicherpositionen
> von Knoten 1 und 2 angegeben werden? Mir stellt sich die Frage, wonach
> der Baum sortiert sein soll, der mit dem Header organisiert ist. Größe
> und Position haben ja jeweils schon eine Map.
> 
> Mir ist auch noch keine Idee gekommen, wie man den Knoten auswählt, der
> bei insertNode() wiederverwendet werden soll.

Wenn wir das mal mit RAM statt Datei durchspielen, meinte ich verstanden
zu haben, dass dir sowas vorschwebt:

     struct Node {
         struct Node* left;
         struct Node* right;
         int payload;
     };

     void store(struct Node* root, int payload)
     {
         struct Node* new_node = malloc(sizeof(struct Node));
         new_node->payload = payload;
         // hier den Knoten einketten, also z.B.
         new_node->left = root->left;
         root->left = new_node;
         // (AVL-tree-insert bekomm ich aus dem Kopf jetzt nicht hin)
     }

     // und zum Freigeben von Speicher dann
     store(addrlist_root, address);
     store(sizelist_root, size);

Ich meine, pack die Metadaten direkt in die Speicherblöcke, so dass
keine separate Allokation notwendig ist:

     struct FreeBlock {
         // ...hier Headerinformationen, falls du welche brauchst
         struct Node in_addrlist;
         struct Node in_sizelist;
     };

     void insertNode(struct Node* root, struct Node* node)
     {
         // hier nur das Einketten
         node->left = root->left;
         root->left = node;
     }

     // und zum Freigeben von Speicher dann
     struct FreeBlock* p = (struct FreeBlock*) address;
     p->in_addrlist.payload = address;
     insertNode(addrlist_root, &p->in_addrlist);
     p->in_sizelist.payload = size;
     insertNode(sizelist_root, &p->in_sizelist);


VG,
Stefan

Back to de.sci.informatik.misc | Previous | NextPrevious in thread | Next in thread | Find similar


Thread

Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-13 09:59 +0000
  Re: Freispeichermanagement Stefan Reuther <stefan.news@arcor.de> - 2022-12-13 18:28 +0100
    Re: Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-13 20:19 +0100
      Re: Freispeichermanagement Stefan Reuther <stefan.news@arcor.de> - 2022-12-14 19:55 +0100
        Re: Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-15 01:40 +0100
          Re: Freispeichermanagement Stefan Reuther <stefan.news@arcor.de> - 2022-12-15 11:30 +0100
            Re: Freispeichermanagement Andreas Wagner <andreasw-usenet@web.de> - 2022-12-18 11:28 +0000

csiph-web