2009-01-26 9 views

Respuesta

10

Hay una biblioteca de código abierto que da a estos (y más información sistema de cosas) a través de muchas plataformas: SIGAR API

Lo he utilizado en grandes proyectos con y funciona bien (a excepción de ciertos casos de esquina en OS X etc.)

5

No, no hay, no en el estándar.

Si realmente necesita esta información, tendrá que escribir #ifdefs específicos de la plataforma o vincularlos contra una biblioteca que lo proporcione.

30

Lamentablemente, estas cosas dependen en gran medida del sistema operativo subyacente, por lo que no hay llamadas independientes de la plataforma. (Tal vez haya algunos frameworks wrapper, pero no conozco ninguno.)

En Linux puede echar un vistazo a la llamada a la función getrusage(), en Windows puede usar GetProcessMemoryInfo() para uso de RAM. También eche un vistazo a las otras funciones en el Process Status API de Windows.

+5

¿Por qué es esto triste? La gran variedad de CPU/RAM/NUMA/(inserte uno o más acrónimos aquí) hace que un mecanismo de informe independiente de la plataforma sea algo limitado. – MSN

+0

getrusage no configura la mayoría de los campos, ya que por ahora, el uso de RAM no se establece de acuerdo con su enlace –

11

No existe una función de plataforma independiente para esto que yo sepa. SI planea enfocarse en múltiples versiones de Windows, tenga en cuenta que la implementación es diferente en algunas versiones. Llegué a este problema al probar una aplicación en NT 3.51, por ejemplo ... (arcaico, lo sé).

Aquí hay un código que utilicé para el lado de la memoria. Esto no funciona en plataformas que no sean Windows, y simplemente devolverá 0 cuando se compila sin la definición de WIN32:

EDITAR: Olvidé mencionar que este código se divide y redondea al MB más cercano, de ahí el >> 20 por todo el lugar.

// 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

No directamente.

Pero puede usar una biblioteca que abstraiga el sistema operativo (como ACE).
Aunque esto podría ser un poco pesado si solo quieres CPU y memoria.

1

No hay una plataforma independiente para hacer esto. Aunque para Windows, puede obtener el uso de la CPU y las métricas de rendimiento utilizando PDH.dll (Performance Data Helper) y sus API relacionadas en su código.

Here's more on how to use it.

2

En Linux, esto usará/proc/self/status. Se requiere más trabajo para convertir esto en un número. Sin embargo, considero que esto es útil, solo para imprimir el uso de la memoria directamente en la pantalla como una cadena.

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

Si ese es todavía el caso, por favor compruebe:

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

Le da un ejemplo de cómo alcanzar la CPU y la RAM el uso de un Linux (probado en Debian y CentOS) y unos instrucción simple de cómo instalar.

No dude en preguntar si tiene alguna pregunta sobre este pequeño proyecto.

Cuestiones relacionadas