Panke hat geschrieben:Tut mir Leid, wenn das bei dir irgendwie arrogant ankam oder ähnlich.[/qoute]
Kein Problem
Panke hat geschrieben:Egal was du baust, ich denke es wird immer darauf hinauslaufen, dass du die Elemente irgendwann umspeichern musst, um eine Defragmentierung zu vermeiden. Es sei denn, du kannst die Reihenfolge beim Löschen mit einer gewissen Wahrscheinlichkeit garantieren.
Das ist das Problem, ich muss möglichst die Fragmentierung klein halten, da nachträglich defragmentieren meist viel zu zeitintensiv ist.
Die Reihenfolge beim Löschen kann ich nicht garantieren, es ist zwar oft so, dass Tasks, die früher starten, auch früher beenden, aber es ist auch klar, dass es dafür mehr als genug Ausnahmen gibt

"Init" z.B. ^^
Panke hat geschrieben:2. Eine eigene Hashtable, wie von cloidnerux vorgeschlagen. In "Algorithmen und Datenstrukturen" von Saake, Sattler wird eine Hashtable vorgestellt, die dynamisch wachsen kann, indem mehr bits vom Schlüssel signifikant werden. Das könntest du adaptieren.
Hm, wie eine Hashtabelle funktioniert weiß ich (Algo-Dat von Cormen et al)
Problem ist eben, wie fordere ich den Speicher für die Tabelle an?
Ich bekomme nur 4KB Blöcke

Und ich muss auch die genaue Adresse (virtuelle) selbst festlegen, sprich ich bekomme keinen Zeiger, sondern muss mir überlegen, wo der Speicherbereich hin soll.
canlot hat geschrieben:Weißt du überhaupt was Speicherverwaltung ist?
Ich? Ja ^^ Sehr genau sogar, im Bezug auf die unterschiedlichsten Abstraktionsstufen einer Speicherverwaltung. Ich weiß auch, wie das "echte" malloc funktioniert und implementiert ist.
Xin hat geschrieben:1.) MemoryPool: Du alloziierst Speicher für gleich 2^n Objekte am Stück. Die Anforderung an das OS, um Speicher zu erhalten, ist sehr kostenintensiv. Du hast so 2^n Elemente, die Du mit "internen Indizes" addressieren kannst (wobei die internen Indizes im Idealfall gleich die Adresse im Array sind)
Da Du freigeben kannst brauchst Du für jeden Memorypool eine doppelt verkettete Liste allen internen Indizes. Vorne die freien, am Ende die belegten Elemente. Brauchst du ein Element, nimmst Du Dir links einen Index raus und packst ihn ans Ende. Gibst Du ihn frei, packst Du den Index wieder an den Anfang.
2.) Referenzen: Jeder Memory-Pool braucht eine Tabelle mit den externen Indizes, die von 0 bis (2^n)-1 gehen. In der Tabelle steht der interne Index, so dass Du mit dem externen Index direkt weißt, wo Du die Daten im MemoryPool findest.
3.) Bereiche im Index. Ein Memory Pool ist immer 2^n Elemente groß. Ist n == 5, hast Du pro Pool 32 Elemente. Brauchst Du mehr Elemente, so brauchst Du weitere Memory-Pools. Du brauchst also einen Wrapper, der mit den hinteren 5 Bit das Element im Pool raussucht und mit den höherwertigen Bits aus einem eigenen Pool-Array den richtigen Memory-Pool herausholt.
Ok, Punkt 1 hat mir sehr geholfen, speziell die Idee mit der frei/nicht frei Liste, die du da hast.
Die werde ich annehmen für die Speicherverwaltung, die noch näher an der Hardware ist (also die, die sagt, welcher 4KB Block - physikalische Adresse - frei ist und welcher nicht)
Punkt 2 verstehe ich jetzt nicht ganz. Meinst du damit einfach nur die Umrechnung externer Indizes auf interne?
Punkt 3 hat mich an meine Implementierung der grundlegenden Speicherverwaltung erinnert:
Ein Bitfeld, dass angibt, welche Blöcke frei sind und welche nicht (die Adresse des Blocks berechnet sich aus der Position eines Bits im Bitfeld, und umgekehrt)
Dann noch ein "Master-Bitfeld", welches anstatt Blöcke die anderen Bitfelder verwaltet.
Hierbei hatte ich natürlich den Vorteil, genau zu wissen, wieviele Speicherblöcke ich verwalten muss. Deren Anzahl ändert sich ja nun auch nicht. Bei der Verwaltung der Tasks habe ich aber das Problem...
Xin hat geschrieben:Damit hast Du pro Zugriff die Zerlegung des Index, den Zugriff auf das Memorypool-Array, den Zugriff auf die Referenztabelle im Memorypool und dann den Zugriff auf das Datenelement.
Die Liste im Memorypool, die die freien und belegten Elemente verwaltet, kannst Du Dir auch in den Wrapper legen, so dass Du schnell weißt, in welchem Pool noch Elemente frei sind und wo nicht - dann sind die Indizes nach einer Freigabe allerdings nicht mehr fortlaufend, sondern würden wiederverwertet.
Das ist nicht weiter drastisch, nach einer Freigabe kann ein Index ruhig wieder verwendet werden.
Wie verhindere ich zu starke Fragmentierung?
Xin hat geschrieben:Der Worstcase in dem Szenario sind 1000 Elemente, die auf 32000 alloziierten Elementen verteilt sind. Würde ich aber als unwahrscheinlich ansehen. Wenn Du zwischen den Pools verschieben willst, musst Du für den festen, externen Index eine Hashtabelle für die "externen Index" aufbauen.