Hallo Leute!
Für eine Übung auf der Uni müssen wir u.A. einen Task erledigen, bei dem malloc() und free() für den Userspace zu implementieren sind. Ich bin im Moment noch der Meinung malloc() soweit in Ordnung implementiert zu haben und zwar wie folgt:
Über sbrk() stelle ich fest wie viel Speicher dem Programm zur Verfügung steht und verwalte von malloc() reservierten Speicher in einer doppelt verketten Liste über die ich feststellen kann, ob bei einem weiteren malloc() zwischen zwei Datenbereichen Platz ist oder ob neuer Speicher vom Kernel angefordert werden muss.
Soweit so gut..
Unser Kernel verwaltet seinen Speicher mit "Virtual Memory Areas". Das hab nicht ich implementiert, aber im Grunde gibt es einen VMA, der sozusagen unseren Heap repräsentiert und wächst, wenn man über malloc() Speicher anfordert. sbrk() vergrößert also ggf. diesen Bereich und die entsprechenden Pages werden gemappt.
Nun zum eigentlichen Problem:
Angenommen ein Userspace-Programm reserviert sich unmengen an Speicher.. Hausnummer: 1GB in diversen Arrays und am Schluss noch einen Pointer auf einen Integer am Ende der Daten. Wenn dieses Programm nun seinen gesamten Speicher bis auf diesen letzten einen Pointer freigibt, dann weiß zwar malloc(), dass am Heap Speicher frei wurde, aber der Kernel würde den VMA nicht verkleinern (können), da das Programm ja nach wie vor der Pointer auf den Integer am Ende der Daten gültig ist. Demnach würden die Pages gemappt bleiben und der RAM, obwohl schon ge-free()-d, "voll" bleiben.
Habe ich nun etwas falsch verstanden oder übersehe ich da etwas? Ich konnte nirgendwo eine Erklärung finden wann/wie/wo bei einem Aufruf von free() Speicher nicht nur am Heap freigegeben wird sondern eben auch tatsächlich Pages ungemappt werden um den physikalischen Speicher zu leeren.
Wäre dankbar für einen Schubs in die richtige Richtung!
LG Stefan