Problem mit free () bei Strukturen in C. Es reduziert nicht die Speichernutzung

8

Ich habe ein Problem mit free () auf einer Struktur in meinem C-Programm. Wenn ich / proc // statm vor und nach dem freien schaue, scheint es nicht zu reduzieren. Benutze ich free () in diesem Fall falsch, oder lese ich / proc // statm falsch?

Hier ist ein Testfall, der das Problem ergibt:

%Vor%

Die Ausgabe ist:

%Vor%

Wenn ich es erwarten würde:

%Vor%

Ich habe einen ähnlichen Test gemacht mit malloc'ing a (char *), dann frei 'es und es funktioniert gut. Gibt es etwas Besonderes an Strukturen?

    
oprimus 14.05.2011, 23:05
quelle

4 Antworten

12

Ihre Antwort ist direkt hier auf Stack Overflow , aber Die kurze Version besteht darin, dass der Speicherzuordner aus guten Gründen keinen Speicher an das Host-Betriebssystem zurückgibt, sondern ihn (intern im Datenbereich Ihres Programms) als eine Art freie Liste speichert.

Einige der Gründe, warum die Bibliothek den Speicher beibehält, sind:

  • Interagieren mit dem Kernel ist viel langsamer als einfach Bibliothekscode ausführen
  • Der Vorteil wäre gering. Die meisten Programme haben einen stationären oder zunehmenden Speicherbedarf, so dass die Zeit, die für die Analyse des Heapspeichers auf der Suche nach Mehrwegspeicher benötigt wird, vollständig verschwendet wird.
  • Interne Fragmentierung macht page-aligned Blöcke (die einzige Sache, die zum Kernel zurückgegeben werden könnte) unwahrscheinlich, ein weiterer Grund, das Programm nicht zu verlangsamen, um nach etwas zu suchen, das nicht da ist.
  • Bei der Rückgabe einer in einen freien Block eingebetteten Seite werden die unteren und oberen Teile des Blocks auf beiden Seiten der Seite fragmentiert.
  • Die wenigen Programme, die große Mengen an Speicher zurückgeben, umgehen wahrscheinlich malloc () und weisen einfach und kostenlos freie Seiten mit mmap (2) zu.
DigitalRoss 14.05.2011, 23:09
quelle
1

Immer wenn free den Speicher tatsächlich freigibt, ist die Implementierung abhängig. Vielleicht gibt free den Speicher nicht sofort zurück, wenn es sich um einen großen Speicherblock handelt. Ich denke nicht, dass es etwas mit struct s zu tun hat.

    
Pablo Santa Cruz 14.05.2011 23:10
quelle
1

Hauptsächlich aus Gründen der Leistung wird der zugewiesene Heapspeicher nach der Freigabe nicht an das Betriebssystem zurückgegeben. Es wird jedoch als frei markiert, und vielleicht wird der Kernel es später zurückbekommen, oder Ihr Programm wird es zuweisen und es erneut verwenden.

Ich weiß nicht, was Sie verwendet haben, um (char *) zuzuweisen / freizugeben. Der Unterschied, den Sie gesehen haben, könnte sein, dass Ihr (char *) auf dem Stack zugewiesen wurde und der Release / Free-Prozess anders ist als mit dem Heap (Stack-Speicherverwaltung ist viel einfacher).

    
ack__ 14.05.2011 23:27
quelle
0

Es ist Sache des Betriebssystems, Ihre Daten wirklich freizugeben und damit den Speicherverbrauch Ihres Programms zu verringern. Sie sagen nur, dass Sie diesen Speicher nicht mehr benutzen werden.

    
Christian Rau 14.05.2011 23:14
quelle