|
Verfasst am: 14.12.2005 [17:07]
|
|
Robbes
Themenersteller
Dabei seit: 02.03.2002
Beiträge: 2657
|
N'abend!
Ich hab heute schon mit diversen ps-Optionen rumgespielt, aber zu einem zufriendenstellenden Ergebnis bin ich nicht gekommen: Wie kann man feststellen, wie viel (Bytes / KBytes / MBytes / was auch immer) RAM ein spezieller Prozess verbraucht? Name und PID seien als bekannt gegeben (so viel kriege ich noch selber hin ), das ganze sollte möglichst unabhängig von der Distribution in einer Shell (hier: Bash) funktionieren.
Hintergrund: Bei selbst geschriebenen C-Programmen die malloc() nutzen interessiert es mich einfach. Eine Antwort auf die Frage konnten mir selbst diverse Lehrer nicht geben, also stelle ich die Frage einfach mal hier.
Unabhängigkeit von der Distribution ist wichtig weil das ganze unter Ubuntu 5.10, FC 4 und SuSE 9.2 funktionieren soll, Shell ist wichtig weil der Zugriff auf die Maschinen teils per PuTTY bzw. ssh erfolgt.
Besten Dank im Voraus!
|
|
Verfasst am: 17.12.2005 [12:40]
|
|
joe
Dabei seit: 07.04.2002
Beiträge: 1225
|
ps axo pid,vsz,rss,comm
Die Spalten VSZ und RSS sind interessant.
VSZ (virtual memory size) sagt Dir, wieviel Virtual Memory der Prozess insgesamt frißt (also incl. Data, Text, Stack, im Swap befindlicher Teile usw.). Im physikalischen RAM ist in den meisten Fällen nur ein Teil davon tatsächlich belegt. Für den Prozess sind aber in der (virtuellen!) Speicherverwaltung von Linux insgesamt soviel kB reserviert (falls Dir das weiterhilft: VSZ entspricht also der "VM size" unter Windows). Das ist vermutlich der Wert, der Dich interessiert.
RSS (resident set size) ist die Menge an Virtual Memory, die sich momentan tatsächlich im physikalischen RAM befindet. Teile des VSZ-image, die sich im Swap befinden oder momentan nicht genutzt werden, werden nicht angezeigt. RSS ist also VSZ minus geswappte Programmteile minus ungenutzter Speicher aus dem VSZ-Image.
RSS dürfte für Dich deswegen uninteressant sein, weil sich der Wert nicht unbedingt vergrößert, wenn Du mittels malloc() Speicher alloziierst. Wenn Du den neu alloziierten Spcher nur reservierst, aber nicht nutzt, wird erst mal nur die VSZ größer, die RSS bleibt aber weitestgehend unverändert. Memory leaks findest Du also mit der VSZ leichter.
Beispiel:[code:1:b68436c415] PID VSZ RSS COMMAND
6444 105336 55940 firefox-bin[/code:1:b68436c415]
Für Firefox sind also rund 102MB Virtual Memory bei der Speicherverwaltung angefordert und reserviert. Rund 54MB davon sind im physikalischen RAM tatsächlich belegt. Die beim RSS "fehlenden" 48MB werden entweder von Firefox momentan nicht genutzt und werden vom System für andere Zwecke eingesetzt (z.B. Cache Buffers) oder liegen im Swap.
cu
Joe
while(!asleep()) sheep++;
|
|
Verfasst am: 17.12.2005 [13:53]
|
|
Robbes
Themenersteller
Dabei seit: 02.03.2002
Beiträge: 2657
|
Danke, joe! Jetzt weiss ich, dass mein Programm ~1,5 KB Speicher angefordert hat und davon gerade mal ~450 B benutzt. Ja, es ist ein seeehr kleines Programm - erste Spielereien mit malloc()
|
|
Verfasst am: 17.12.2005 [16:52]
|
|
joe
Dabei seit: 07.04.2002
Beiträge: 1225
|
Hehe, stimmt, das ist wirklich sehr klein 
Sowas in der Art?[code:1:a0b8f9cfd8]/******************************************************************************
* project: -
* file: memleak.c
* purpose: quickly eats a lot of memory
* TAKE CARE:
* could hang your system or make the kernel randomly kill processes
* (c): 2005 joe
* license: GPL (http://www.gnu.org/licenses/gpl.txt)
******************************************************************************/
#include <stdlib.h>
#include <stdio.h>
#include <errno.h>
int main(int argc, char *argv[])
{
int *myMem;
while(errno == 0 && myMem != NULL) {
myMem = malloc(1024);
}
printf("error %i: unable to malloc() memory n", errno);
return 0;
}[/code:1:a0b8f9cfd8]
cu
Joe
while(!asleep()) sheep++;
|
|
Verfasst am: 17.12.2005 [20:14]
|
|
Robbes
Themenersteller
Dabei seit: 02.03.2002
Beiträge: 2657
|
Vom Code her dann doch was mehr, wenn auch nicht vom Speicherverbrauch:
[code:1:134f18574d]/* Robert Weiler, bbsh5a, 2005-12-14
Lottozahlen-Simulation mit Arrays (Pointern) */
#include <stdio.h>
#include <stdlib.h>
/* Initialisiert ein Array mit Elementen von 1 bis Anzahl */
int pool_init(unsigned short*, int);
/* Entfernt ein Element aus einem Array, ersetzt die Position mit 0 */
unsigned short pool_remove(unsigned short*, int);
/* Fuehrt die Ziehung durch */
unsigned int ziehung(unsigned short*, int, int);
/* Hauptprogramm. Nimmt Eingaben entgegen und fuehrt die Ziehung durch. */
int main() {
/* Variablendeklaration */
unsigned short *pool, gezogen, kugel, *ergebnis;
int kugeln, ziehen, i;
unsigned int schritte;
/* Zufallszahlengenerator initialisieren */
srand(time(NULL));
/* noetige Variableninitialisierungen */
kugeln = ziehen = -1;
/* Benutzereingaben entgegennehmen */
printf("Lottozahlen-Simulation n n");
while (kugeln < 1 || kugeln > 100) {
printf("Wieviele Kugeln sollen zu Verfuegung stehen (1-100)? ");
scanf("%d", &kugeln);
}
while (ziehen < 1 || ziehen > kugeln) {
printf("Wieviele werden davon gezogen (1-%d)? ", kugeln);
scanf("%d", &ziehen);
}
/* Speicher fuer die einzelnen Kugeln reservieren */
pool = (unsigned short *)malloc(kugeln * sizeof(unsigned short));
if (pool == NULL) {
printf(" nFehler: Zu wenig Speicher verfuegbar! n n");
return -1;
}
pool_init(pool, kugeln);
/* Die Ziehung */
schritte = ziehung(pool, kugeln, ziehen);
printf(" nBenoetigte Rechenschritte: %d n", schritte);
/* Speicher freigeben */
free(pool);
pool = NULL;
return 0;
}
int pool_init(unsigned short *pool, int elemente) {
int i;
for (i = 0; i < elemente; i++) {
*(pool + i) = (i + 1);
}
return i;
}
unsigned short pool_remove(unsigned short *pool, int element) {
unsigned short val;
val = *(pool + element - 1);
*(pool + element - 1) = 0;
return val;
}
unsigned int ziehung(unsigned short *pool, int kugeln, int ziehen) {
unsigned int i, schritte;
unsigned short gezogen;
i = schritte = 0;
printf("Ziehung %d aus %d: n", ziehen, kugeln);
while (i < ziehen) {
gezogen = pool_remove(pool, rand() % kugeln + 1);
if (gezogen != 0) {
printf("%-3d ", gezogen);
i++;
}
schritte++;
}
return schritte;
}[/code:1:134f18574d]
Wir sollten halt in der Schule obiges Programm schreiben, eigentlich um den Umgang mit Arrays zu üben. Aber Arrays sind schließlich langweilig, also habe ich lieber Arrays mit Pointern nachgebaut . Man beachte die tollen Kommentare überall...
|