Autor Thema: malloc(), free()  (Gelesen 2577 mal)

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« am: 16. January 2013, 13:35 »
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 :)
« Letzte Änderung: 16. January 2013, 13:37 von nnosdev »

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 16. January 2013, 14:35 »
Das hast du meines Erachtens alles richtig verstanden. Ans OS zurückgegeben werden kann Speicher nur über sbrk() mit negativem Parameter, also indem man das Ende des Heaps freigibt. Wenn das Ende nicht frei ist, Pech.

Und genau das ist einer der Gründe, warum ich sbrk() als Interface für die Speicherverwaltung nicht mag...
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

nnosdev

  • Beiträge: 61
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 16. January 2013, 20:46 »
Hi!

Danke für die Antwort, hab das mittlerweile schon von weiteren Quellen bestätigt bekommen, dass das anscheinend tatsächlich so funktioniert. Kam mir etwas komisch vor und verstehe deine Bedenken :D


LG; Stefan

 

Einloggen