2009-01-26 13 views

Antwort

10

Es ist ein Open-Source-Bibliothek, die diese (und weitere Systeminformationen Sachen) über viele Plattformen gibt: SIGAR API

Ich habe es in ziemlich großen Projekten eingesetzt und es funktioniert gut (mit Ausnahme bestimmte corner cases unter OS X etc.)

5

Nein, gibt es nicht, nicht im Standard.

Wenn Sie diese Informationen wirklich benötigen, müssen Sie plattformspezifische #ifdefs oder eine Verknüpfung mit einer Bibliothek erstellen, die diese Informationen bereitstellt.

30

Leider hängen diese Dinge stark von dem zugrunde liegenden Betriebssystem ab, so dass es keine plattformunabhängigen Aufrufe gibt. (Vielleicht gibt es einige Wrapper Frameworks, aber ich kenne keine.)

Unter Linux können Sie einen Blick auf die getrusage() Funktionsaufruf, unter Windows können Sie GetProcessMemoryInfo() für RAM-Nutzung verwenden. Sehen Sie sich auch die anderen Funktionen in der Process Status API von Windows an.

+5

Warum ist das traurig? Die schiere Vielfalt an CPU/RAM/NUMA/(hier ein oder mehrere Akronyme einfügen) macht einen plattformunabhängigen Berichtmechanismus etwas eingeschränkt. – MSN

+0

Die meisten Felder werden nicht durch getrusage festgelegt, da die RAM-Nutzung derzeit nicht entsprechend Ihrer Verknüpfung festgelegt ist –

11

Es gibt keine plattformunabhängige Funktion für die ich weiß. Wenn Sie beabsichtigen, mehrere Windows-Versionen zu targeten, sollten Sie beachten, dass die Implementierung in einigen Versionen unterschiedlich ist. Ich habe dieses Problem beim Testen einer App unter NT 3.51 zum Beispiel ... (archaisch, ich weiß).

Hier ist ein Code, den ich für die Speicherseite der Dinge verwendet habe. Dies funktioniert nicht über andere Plattformen als Windows und gibt nur 0 zurück, wenn es ohne die WIN32-Definition kompiliert wird:

EDIT: Ich habe vergessen zu erwähnen, dieser Code teilt und rundet auf den nächsten MB ab, daher der >> 20 überall.

// get memory info... 
int getTotalRAM() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullTotalPhys>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwTotalPhys>>20); 
    } 
#endif 
    return ret; 
} 

int getAvailRAM() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullAvailPhys>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwAvailPhys>>20); 
    } 
#endif 
    return ret; 
} 

int getTotalMemory() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullTotalPhys>>20) + (int)(m.ullTotalVirtual>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwTotalPhys>>20) + (int)(m.dwTotalVirtual>>20); 
    } 
#endif 
    return ret; 
} 

int getAvailMemory() 
{ 
    int ret = 0; 
#ifdef WIN32 
    DWORD v = GetVersion(); 
    DWORD major = (DWORD)(LOBYTE(LOWORD(v))); 
    DWORD minor = (DWORD)(HIBYTE(LOWORD(v))); 
    DWORD build; 
    if (v < 0x80000000) build = (DWORD)(HIWORD(v)); 
    else build = 0; 

    // because compiler static links the function... 
    BOOL (__stdcall*GMSEx)(LPMEMORYSTATUSEX) = 0; 

    HINSTANCE hIL = LoadLibrary(L"kernel32.dll"); 
    GMSEx = (BOOL(__stdcall*)(LPMEMORYSTATUSEX))GetProcAddress(hIL, "GlobalMemoryStatusEx"); 

    if(GMSEx) 
    { 
     MEMORYSTATUSEX m; 
     m.dwLength = sizeof(m); 
     if(GMSEx(&m)) 
     { 
      ret = (int)(m.ullAvailPhys>>20) + (int)(m.ullAvailVirtual>>20); 
     } 
    } 
    else 
    { 
     MEMORYSTATUS m; 
     m.dwLength = sizeof(m); 
     GlobalMemoryStatus(&m); 
     ret = (int)(m.dwAvailPhys>>20) + (int)(m.dwAvailVirtual>>20); 
    } 
#endif 
    return ret; 
} 
0

Nicht direkt.

Sie können jedoch eine Bibliothek verwenden, die das Betriebssystem abstrahiert (z. B. ACE).
Obwohl dies ein bisschen schwer, wenn Sie nur CPU und Arbeitsspeicher wollen.

1

Es gibt keinen plattformunabhängigen Weg, dies zu tun. Für Windows können Sie die Werte für CPU-Auslastung und Leistung ermitteln, indem Sie PDH.dll (Performance Data Helper) und die zugehörigen APIs in Ihrem Code verwenden.

Here's more on how to use it.

2

Unter Linux wird dies/proc/self/status verwenden. Es ist mehr Arbeit erforderlich, um dies zu einer Nummer zu machen. Ich finde das nützlich, wie es ist, nur um die Speichernutzung direkt auf dem Bildschirm als String zu drucken.

static string memory_usage() { 
     ostringstream mem; 
     PP("hi"); 
     ifstream proc("/proc/self/status"); 
     string s; 
     while(getline(proc, s), !proc.fail()) { 
       if(s.substr(0, 6) == "VmSize") { 
         mem << s; 
         return mem.str(); 
       } 
     } 
     return mem.str(); 
} 
0

Wenn dies immer noch der Fall überprüfen Sie bitte:

http://sourceforge.net/projects/cpp-cpu-monitor/

Es gibt Ihnen ein Beispiel, wie die CPU und RAM-Auslastung eines Linux (getestet auf Debian und CentOS) zu erhalten und ein ganz einfache Anleitung zur Installation.

Bitte zögern Sie nicht zu fragen, wenn Sie Fragen zu diesem kleinen Projekt haben.

Verwandte Themen