web-dev-qa-db-ja.com

現在のCPUとRAM C ++での使用法を取得する方法は?

c ++で、現在のRAMおよびCPU使用率を取得することは可能ですか?プラットフォームに依存しない関数呼び出しはありますか?

29
tunnuz

多くのプラットフォームにわたってこれら(およびより多くのシステム情報)を提供するオープンソースライブラリがあります。 SIGAR API

かなり大規模なプロジェクトで使用しましたが、正常に動作します(OS Xの特定のコーナーケースを除きます)。

11
ididak

悲しいことに、これらは基盤となるOSに大きく依存しているため、プラットフォームに依存しない呼び出しはありません。 (ラッパーフレームワークがいくつかあるかもしれませんが、私は知りません。)

Linuxでは getrusage() 関数呼び出しを確認でき、Windowsでは GetProcessMemoryInfo() を使用してRAM使用法を確認できます。 Windowsの Process Status API の他の関数も確認してください。

30
Kosi2801

私が知っているこのためのプラットフォームに依存しない機能はありません。 Windowsの複数のバージョンを対象とする場合は、バージョンによって実装が異なることに注意してください。たとえば、NT 3.51でアプリをテストするときにこの問題に遭遇しました...

これは私が物事のメモリ側に使用したいくつかのコードです。これはWindows以外のプラットフォームでは機能せず、WIN32定義なしでコンパイルすると0を返します。

編集:私は言及するのを忘れていました、このコードは最も近いMBに分割して切り捨てますので、場所全体で>> 20です。

// 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;
}
11
jheriko

いいえ、標準ではありません。

この情報が本当に必要な場合は、プラットフォーム固有の#ifdefsを作成するか、それを提供するライブラリに対してリンクする必要があります。

5
HUAGHAGUAH

Linuxでは、これは/ proc/self/statusを使用します。これを数値にするには、さらに作業が必要です。ただし、メモリの使用量を文字列として画面に直接出力するだけで、これは便利です。

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();
}
2
Aaron McDaid

これを行うプラットフォームに依存しない方法はありません。 Windowsの場合でも、コードでPDH.dll(Performance Data Helper)とその関連APIを使用することにより、CPU使用率とパフォーマンスメトリックを取得できます。

使用方法の詳細はこちら

1
Samrat Patil

それでも問題が解決しない場合は、次を確認してください。

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

CPUとRAM Linuxの使用法(DebianおよびCentOSでテスト済み))の例と、インストール方法の非常に簡単な指示を示しています。

この小さなプロジェクトについてご不明な点がございましたら、お気軽にお問い合わせください。

0

直接ではありません。

ただし、OSを抽象化するライブラリ(ACEなど)を使用できます。
CPUとメモリだけが必要な場合は、少し重いかもしれませんが。

0
Martin York