Betrachten Sie den folgenden C-Code, der 100.000 4KB große Seiten erstellt, dann 99.999 Seiten freigibt und schließlich die letzte Seite freigibt:
%Vor% Wenn Sie es kompilieren, es ausführen und die Speicherauslastung des Prozesses überwachen, können Sie sehen, dass die Speicherauslastung vor dem ersten getchar
(wenn Speicher für 100.000 Seiten reserviert ist) etwa 400 MB erreicht und dann gleich bleibt nachdem 99,999 Seiten (nach dem zweiten getchar
) freigegeben wurden und schließlich bei der letzten Zuweisung der Seite auf 1 MB fallen.
Also, meine Frage ist, warum passiert das? Warum wird der gesamte Speicher nur dann an das Betriebssystem zurückgegeben, wenn alle Seiten freigegeben sind? Gibt es irgendeine Seitengröße oder Seitenausrichtung, die verhindert, dass so etwas passiert? Ich meine, gibt es irgendeine Seitengröße oder Ausrichtung das macht jede Malloced-Seite vollständig an das Betriebssystem zurückgegeben, wenn nur eine Seite befreit wird?
Dies ist vollständig implementierungsabhängig, aber ich glaube, dass dies mit der Funktionsweise des Speicherzuordners zu tun hat. Wenn der Speichermanager normalerweise mehr Speicher vom Betriebssystem benötigt, ruft er die Funktion sbrk
auf, um zusätzlichen Speicher anzufordern. Die typische Implementierung dieser Funktion besteht darin, dass das Betriebssystem einen Zeiger auf die nächste freie Adresse im Speicher speichert, in der der Prozess Platz finden kann. Der Speicher wächst wie ein Stapel, ähnlich wie der Aufruf-Stack funktioniert. Wenn Sie beispielsweise fünf Seiten Speicher zugewiesen haben, sieht es möglicherweise so aus:
Wenn Sie bei dieser Konfiguration die Seiten 0 - 4 freigeben, markiert der Speichermanager im Programm diese als frei, wie folgt:
%Vor%Da das Betriebssystem Speicher in einer Stapel-ähnlichen Weise zuweist, kann es nicht all diesen Speicher aus dem Programm zurückfordern, bis die Verwendung beendet ist. Sobald Sie die allerletzte Seite freigegeben haben, wird der Speicher des Prozesses wie folgt aussehen:
%Vor%Und zu diesem Zeitpunkt kann der Speichermanager des Programms diese große Menge an freiem Speicherplatz an das Betriebssystem zurückgeben:
%Vor%Mit anderen Worten: Da der Speicher als Stack zugewiesen wird, kann das Betriebssystem den Speicher nicht zurückfordern, bis Sie die allerletzte Zuteilung aufgehoben haben.
Hoffe, das hilft!
Tags und Links c memory-leaks linux memory-management malloc