Lowlevel
Lowlevel => Lowlevel-Coding => Thema gestartet von: bitmaster am 05. April 2009, 21:01
-
Hi,
ich habe mir mal erlaubt den Source der Funktion free von tyndur (oder so) anzuschauen, weil ich wissen wollte, wie ihr das so mit dem wieder freigeben von Speicher macht. Nun stelle ich aber fest, dass der Speicher gar nicht wieder freigegeben wird. Wenn ich den Code richtig verstanden habe, wird stattdessen der memory node einfach in eine "Free-Liste" eingetragen. D.h., dass einmal reservierter Speicher gar nicht mehr freigegeben wird? Ist das nur eine "Notlösung" oder ist das wirklich die Funktionsweise von free?
thx
bitmaster
-
hm, mir fällt es irgendwie schwer dir auf
ist das wirklich die Funktionsweise von free?
zu antworten... Es ist einfach eine relativ einfache und relativ brauchbare Implementation. Es gibt wahrscheinlich dutzende andere - von einem free() das (gar)nichts tut bis zu einem free, dass mit der perfekte Balance an Speicherverbrauch und Geschwindigkeit auf jede Sequenz von (De)Allokationen reagiert und gleichzeitig noch massiv parallel benutzbar ist - die legitim sind. Die Frage wie mans implementiert hängt von den Ressourcen die man zum implementieren verwenden will und von dem Zweck ab. Ich würde sagen, die gewählte Implementation ist ausreichend. Andere Implementationen:
* hoard (http://www.hoard.org/)
* dlmalloc (http://g.oswego.edu/dl/html/malloc.html)
* liballoc (http://www.smk.co.za/products/liballoc/)
* ptmalloc (http://www.malloc.de/en/)
Anderer Algorithmus:
* Buddy allocation (http://en.wikipedia.org/wiki/Buddy_memory_allocation)
btw. iirc dann verwenden die in tyndur nicht diese Implementation, sondern eine externe unter BSD Lizenz.
-
Nun stelle ich aber fest, dass der Speicher gar nicht wieder freigegeben wird.
Was verstehst du denn unter 'wieder freigeben'? Ich hab mir die tyndur-Implementierung jetzt nicht extra angesehen, aber was in der 'Free-Liste' wird wohl von malloc berücksichtigt werden, wenn es neuen speicher allocieren soll. Von daher würde ich das schon als wieder freigegeben bezeichnen.
-
Er meinte halt an den Kernel zurückgeben, aber das wird eben nicht gemacht, aber dem Programm steht der Speicher natürlich beim nächsten malloc zur Verfügung.
-
btw. iirc dann verwenden die in tyndur nicht diese Implementation, sondern eine externe unter BSD Lizenz.
Wir haben drei verschiedene Implementierungen im Repository. Wirklich benutzt wird liballoc.