Die '''Heapverwaltung''' ist ein Teil der [[Speicherverwaltung]], der aufbauend auf der virtuellen Speicherverwaltung Funktionen zur Verwaltung dynamisch allozierten Speichers beliebiger Größe- dieser Speicher zusammengenommen wird dann auch als [[Heap]] bezeichnet - bereitstellt. In der C-Standardbibliothek sind damit die Funktionen malloc/free (und Konsorten) bzw. in der C++-Laufzeitumgebung new/delete gemeint. Gelegentlich werden die beiden Funktionen auch als Bestandteil der virtuellen Speicherverwaltung bezeichnet, da sie ebenfalls mit virtuellen Adressen arbeiten. Sie sind aber nicht mit [[Paging]] - d.h. dem was in diesem Wiki als [[Speicherverwaltung#Virtuelle Speicherverwaltung | virtuelle Speicherverwaltung]] beschrieben wird - zu verwechseln. == Überblick == Die oben genannten Funktionen werden sowohl im Userspace - als Teil der Standardbibliothek oder Laufzeitumgebung der verwendeten Programmiersprache - als auch im [[Kernel]] benötigt. Bei der Implementierung im Userspace werden dabei über [[Systemaufruf|Systemaufrufe]] die benötigten Funktionen der virtuellen Speicherverwaltung des Kernels - '''nicht''' der Heapverwaltung des Kernels, da der (Userspace-)Heap (normalerweise) vom Userspace selbst verwaltet wird - aufgerufen. Im Kernel wird direkt auf die virtuelle Speicherverwaltung zugegriffen. == Freispeicherliste == '''TODO: Überarbeiten''' Es gibt verschiedene Möglichkeiten malloc() bzw. free() zu implementieren. Eine Möglichkeit ist es, vor den Speicherblöcken Header anzulegen, die die Länge, Flags (wie z.B ob der Block frei ist) und gegenfalls einen Pointer auf den nächsten freien Block beinhalten. Zum Anfang sind keine freien Blöcke vorhanden. Es wird vom Kernel eine Page angefordert. Nun wird ein Header an den Anfang der Page gesetzt. Wenn nun malloc() aufgerufen wird, wird der Block aufgeteilt und ein Teilblock als benutzt markiert. Bei einem Aufruf von free() wird der Block als frei markiert und in die Liste der freien Blöcke eingefügt. Wenn benachbarte Blöcke auch frei sind, werden diese zusammengefügt. Wenn man nun eine ganze Page hat, die als frei markiert ist, kann sie vom Kernel freigegeben werden oder aufgehoben werden, bis sie wieder gebraucht wird. == Andere Implementierung portieren == Anstatt die benötigten Funktionen selbst zu implementieren ist es natürlich auch möglich bestehende Implementierungen zu portieren. Z. B. stehen folgende Implementierungen unter einer freien Lizenz: * [http://g.oswego.edu/dl/html/malloc.html Doug Lea's Malloc (dlmalloc)] ([[Lizenzen#Public_Domain |Public Domain]]) * [http://www.hoard.org/ The HOARD Memory Allocator] ([[Lizenzen#General_Public_License |GPL]]) == Weblinks == * [http://www.osdever.net/tutorials/pdf/memory2.pdf Memory Management 2] von Tim Robinson