%20reserviert%20wurde.png)
Ich weiß, dass wenn ein Prozess dies tut, malloc()
aber nicht wirklich in diesen Speicher schreibt, Linux davon ausgeht, dass dieser Speicher frei ist und von anderen Prozessen verwendet werden kann (Übervergabe).
Gibt es trotzdem eine Möglichkeit herauszufinden, wie viel Speicher malloc()
von einem bestimmten Prozess verbraucht wurde? (auch wenn er nicht genutzt wird)
Diese Information ist systemweit in verfügbar /proc/meminfo
, ich möchte sie aber für einen bestimmten Prozess wissen.
Ich habe mich damit befasst, /proc/<PID>/{smaps,stat,statm}
bin mir aber nicht sicher, ob diese Informationen angezeigt werden.
Antwort1
Aufrufe, malloc()
die eine Änderung der Datensegmentgröße bewirken (dh, die zuvor zugewiesenen Speicher nicht wiederverwenden – daher werden Zuweisungen, die zu Aufrufen von sbrk()
oder führen, in und mmap()
angezeigt ./proc/$PID/statm
/proc/$PID/stat
In statm
zeigt das erste Feld die gesamte Programmgröße und das sechste Feld die Anzahl der Datenseiten. Beide spiegeln die Speicherzuordnungen wider (auch bei Nichtgebrauch).
In stat
ist das zu betrachtende Feld vsize
(derzeit das 23. Feld).
(Siehe Tabellen 1-3 und 1-4 improc
Dokumentation.)
Beachten Sie, dass hier die gesamte Speichernutzung und die Gesamtgröße der Datensegmente angezeigt werden. Sie können also nicht zwischen belegtem Speicher malloc()
und sonstiger Speichernutzung unterscheiden.
Sie können dies mit dem folgenden Programm in Aktion sehen:
#include <stdio.h>
#include <stdlib.h>
#include <unistd.h>
int main(int argc, char **argv) {
void *buf;
puts("Waiting before allocating...");
sleep(20);
buf = malloc(10*1024*1024*1024L);
puts("Sleeping after allocating...");
sleep(20);
free(buf);
return 0;
}
(Wie immer eine ausgezeichnete Fehlerbehandlung.) Dann
$ ./356532&
[1] 4239
Waiting before allocating...
$ cat /proc/4239/statm
1043 172 154 1 0 81 0
$ cat /proc/4239/stat | awk '{print $23}'
4272128
Sleeping after allocating...
$ cat /proc/4239/statm
2622484 172 154 1 0 2621522 0
$ cat /proc/4239/stat | awk '{print $23}'
10741694464
Andrew Henle wies darauf hin malloc_info(3)
, und Sie können das eigentlich auf so ziemlich jeden Prozess anwenden. Mit dem obigen Beispielprogramm,ohne Debuginformationen(nur um zu zeigen, dass es nicht notwendig ist):
$ gdb ./356532
> break free
(dadurch wird ein Haltepunkt beim Aufruf von free
im Programm eingerichtet – eigentlich bei jedem Aufruf von free
, aber wir werden zuerst „unseren“ erreichen; dies mit zu versuchen, malloc
ist nicht so sinnvoll, weil der Startcode verwendet malloc
)
> run
Wenn gdb
ein Haltepunkt erreicht wird, können Sie malloc_info
wie folgt aufrufen:
> call malloc_info(0, stdout)
Dadurch werden die malloc
Informationen gelöscht.