Groups | Search | Server Info | Login | Register
Groups > de.sci.informatik.misc > #370
| 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> |
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 | Next — Previous in thread | Next in thread | Find similar
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