Avatar billede nomak Nybegynder
09. februar 2006 - 16:31 Der er 19 kommentarer og
1 løsning

Ram forbrug af program.

Hej.

Jeg er på udkig efter lidt C kode der kan fortælle hvor meget ram selve programmet bruger.

Er der nogen der ligger inde med sådan et lille program, eller ved hvor jeg kan finde det?

Mvh Nomak
Avatar billede arne_v Ekspert
09. februar 2006 - 16:37 #1
windows ?
Avatar billede nomak Nybegynder
09. februar 2006 - 16:37 #2
unix
Avatar billede arne_v Ekspert
09. februar 2006 - 16:42 #3
Avatar billede arne_v Ekspert
09. februar 2006 - 16:43 #4
sorry - saa duer det ikke
Avatar billede nomak Nybegynder
09. februar 2006 - 16:55 #5
:/ så det kan ikke lade sig gøre?
Avatar billede arne_v Ekspert
09. februar 2006 - 17:03 #6
det er jeg 98% sikker paa at det kan

men jeg ved ikke lige hvordan og min Unix programmerings bog er pakket ned

maaske andre ved det
Avatar billede thomas_nj Nybegynder
09. februar 2006 - 20:21 #7
Kører du kommandoen ps i linux får du en liste over kørende programmer i textmode. DVS du fanger ikke hvis du eksempelvis har firefox kørende uden for en terminel.

  Ude til højre under det, der hedder PID står der et tal. Går du ind i /proc/ kan du her finde en mappe med det tilsvarende tal. Inde i denne mappe ligger der forskellige informationer om den pågældende process.

  Kunne ikke lige selv finde ram-forbruget, men kan forestille mig det kan findes herinde på en eller anden måde.
Avatar billede thomas_nj Nybegynder
09. februar 2006 - 20:43 #8
Ok er 80 % sikker på at:
  Du skal have fat i /proc/<PID>/status og indlæse VmSize

  Spørgsmålet er så bare hvordan et program selv får fat i sin PID.
Avatar billede thomas_nj Nybegynder
09. februar 2006 - 20:44 #9
Du kan se i manualen for proc.

  * Håber på at BSD og linux fungerer ens på det punkt :)
Avatar billede arne_v Ekspert
09. februar 2006 - 21:00 #10
getpid()
Avatar billede arne_v Ekspert
09. februar 2006 - 21:01 #11
men jeg ved ikke om alle Unix har /proc/<PID>/status
Avatar billede thomas_nj Nybegynder
09. februar 2006 - 21:44 #12
Prøvede lige et lege lidt med top og cat /proc/PID/status Efter hvad mine hurtige test viser skal du have fat i VmRSS for at få det pågældende programs ramforbrug pt. VmSize er hvad der er allokeret til programmet i alt.
Avatar billede thomas_nj Nybegynder
09. februar 2006 - 22:22 #13
Strikkede følgende meget grimme kode sammen.

#include <iostream>
#include <sys/types.h>
#include <fstream>
#include <sstream>
#include <string>

using namespace std;

int main()
{
    string path="/proc/"; // Fuld sti til filen status
    stringstream buff;
    buff << getpid();
    string PID;
    buff >> PID;
    path = path+PID+"/status";
   
    ifstream status(path.c_str());
    char linie[255];

    while(!status.eof())
    {
        status.getline(linie, sizeof(linie));
        if((linie[0]=='V')&&(linie[2]=='R'))
        {
            char buff[255];
            char *pLinie=&linie[5];
            cout<<"Ramforbrug: ";
            while(*pLinie)
            {
                cout<<*pLinie;
                pLinie++;
            }
        }
    }
    return 0;
}

  Antager vi at det er rigtig at ram-forbruget ligger i /proc/PID/status. Er dog som sagt kun 80 % sikker
Avatar billede arne_v Ekspert
10. februar 2006 - 04:16 #14
Saa vidt jeg kan laese er:

VmSize = virtuel hukommelse forbrug = det RAM som programmet gerne vil bruge

VmRSS = fysisk hukommelse forbrug = det RAM som styresystemet har villet give

forskellen ligger saa og roder i swap partitionen

beskrivelsen passer maaske bedst paa VmRSS, men jeg tror faktisk at det er
VmSize der er mest relevant
Avatar billede nomak Nybegynder
10. februar 2006 - 15:04 #15
min /proc/ er tom ?
Avatar billede thomas_nj Nybegynder
10. februar 2006 - 17:02 #16
Nu bruger jeg linux, så aner ikke hvordan andre systemer gør.
Hvis du nu som root kører: "mount -t proc none /proc"
Avatar billede nomak Nybegynder
15. februar 2006 - 18:09 #17
kører med freebsd. kan lige spørge derinde om jeg kan få noget ud af /proc/

Den kommando virkede ikke.
Avatar billede nomak Nybegynder
15. februar 2006 - 21:03 #18
jeg fandt funktionen getrusage og stykkede dette sammen:

#include <stdio.h>
#include <sys/types.h>
#include <sys/time.h>
#include <sys/resource.h>
#define  RUSAGE_SELF    0
#define  RUSAGE_CHILDREN    -1

int main()
{
    int i;
    struct rusage ru;
   
    for(i=0; i<=1000000000; i++)
    {
       
    }
   
    getrusage(RUSAGE_SELF, &ru);
   
    printf("idrss : %d - isrss: %d\n", ru.ru_idrss, ru.ru_isrss);
   
    return 0;
}

output giver :

-bash-3.00$ ./test
idrss : 1012 - isrss: 32384

er det ikke nogenlunde det jeg leder efter?
Avatar billede nomak Nybegynder
15. februar 2006 - 21:03 #19
fra man getrusage:

    ru_idrss    an integral value of the amount of unshared memory residing
                  in the data segment of a process (expressed in units of
                  kilobytes * ticks-of-execution).

    ru_isrss    an integral value of the amount of unshared memory residing
                  in the stack segment of a process (expressed in units of
                  kilobytes * ticks-of-execution).
Avatar billede nomak Nybegynder
20. februar 2006 - 22:20 #20
.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester