プログラミングのメモ帳(C/C++/HSP)

日々のプログラミングで気づいた点や小技集を紹介します。(Windows 10/XP/Vista、VC2017、HSP)

プロセスのメモリ情報を取得

2008年07月07日 15時55分00秒 | プロセス関連

プロセスのメモリ情報を取得するにはGetProcessMemoryInfo()関数を利用します。(戻る)

  1. プロセスのハンドルを開く(OpenProcess)
  2. プロセスのメモリ情報を取得(GetProcessMemoryInfo)
  3. プロセスのハンドルを閉じる(CloseHandle)

取得可能なメモリ情報

  1. ページ・フォールト数(ページ フォルト)
  2. 現在ワーキングセット(メモリ使用量)
  3. 最大ワーキングセット(最大メモリ使用量)
  4. 現在ページプールの使用サイズ(ページ プール)
  5. 最大ページプールの使用サイズ
  6. 現在非ページプールの使用サイズ(非ページ プール)
  7. 最大非ページプールの使用サイズ
  8. 現在ページングファイルの使用サイズ(仮想メモリ サイズ)
  9. 最大ページングファイルの使用サイズ

※カッコ内はタスクマネージャでの表現です。

プロトタイプ宣言

HANDLE OpenProcess(
    DWORD   dwDesiredAccess,    // アクセス・フラグ
    BOOL    bInheritHandle,     // ハンドルの継承オプション
    DWORD   dwProcessId         // プロセス識別子
);

BOOL CloseHandle(
    HANDLE  hObject             // オブジェクトのハンドル
);

BOOL GetProcessMemoryInfo(
    HANDLE                      Process,            // プロセスのハンドル
    PPROCESS_MEMORY_COUNTERS ppsmemCounters,     // 構造体のポインタ
    DWORD                       cb                  // 構造体のサイズ
);

構造体

typedef struct _PROCESS_MEMORY_COUNTERS {
    DWORD   cb;                             // 構造体のサイズ
    DWORD   PageFaultCount;                 // ページ・フォールト数
    SIZE_T  PeakWorkingSetSize;             // 最大ワーキングセット
    SIZE_T  WorkingSetSize;                 // 現在ワーキングセット
    SIZE_T  QuotaPeakPagedPoolUsage;        // 最大ページプールの使用サイズ
    SIZE_T  QuotaPagedPoolUsage;            // 現在ページプールの使用サイズ
    SIZE_T  QuotaPeakNonPagedPoolUsage;     // 最大非ページプールの使用サイズ
    SIZE_T  QuotaNonPagedPoolUsage;         // 現在非ページプールの使用サイズ
    SIZE_T  PagefileUsage;                  // 現在ページングファイルの使用サイズ
    SIZE_T  PeakPagefileUsage;              // 最大ページングファイルの使用サイズ
} PROCESS_MEMORY_COUNTERS, *PPROCESS_MEMORY_COUNTERS;

サンプル

#include <stdio.h>
#include <stdlib.h>
#include <windows.h>
#include <Psapi.h>      // Psapi.Lib

// マクロ関数
#define DISP_PARAM(n)    (n), ((n) / 1024)

// メイン関数
int main( int argc, char *argv[] )
{
    PROCESS_MEMORY_COUNTERS pmc = { 0 };
    DWORD dwProcessID = GetCurrentProcessId();
    HANDLE hProcess;
    
    if ( argc > 1 ){
        dwProcessID = atoi( argv[1] );
    }
    if ( (hProcess = OpenProcess(PROCESS_QUERY_INFORMATION,FALSE,dwProcessID)) != NULL ){
        if ( GetProcessMemoryInfo(hProcess,&pmc,sizeof(pmc)) ){
            printf( TEXT("プロセスID                        :%lu\n"), dwProcessID );
            printf( TEXT("プロセス・ハンドル                :0x%p\n"), hProcess );
            printf( TEXT("ページフォールト数                :%10lu個\n"),             pmc.PageFaultCount );
            printf( TEXT("最大ワーキングセットのサイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PeakWorkingSetSize) );
            printf( TEXT("現在ワーキングセットのサイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.WorkingSetSize) );
            printf( TEXT("最大ページプールの使用サイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPeakPagedPoolUsage) );
            printf( TEXT("現在ページプールの使用サイズ      :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPagedPoolUsage) );
            printf( TEXT("最大非ページプールの使用サイズ    :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaPeakNonPagedPoolUsage) );
            printf( TEXT("現在非ページプールの使用サイズ    :%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.QuotaNonPagedPoolUsage) );
            printf( TEXT("最大ページングファイルの使用サイズ:%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PeakPagefileUsage) );
            printf( TEXT("現在ページングファイルの使用サイズ:%10luバイト(%lu KB)\n"), DISP_PARAM(pmc.PagefileUsage) );
        }
        else{
            printf( TEXT("%lu:GetProcessMemoryInfo()関数のエラーです。\n"), GetLastError() );
        }
        CloseHandle( hProcess );
        return 0;
    }
    printf( TEXT("%lu:OpenProcess()関数のエラーです。\n"), GetLastError() );
    return 1;
}
  • ヘッダファイルとしてPsapi.hをインクルードします。
  • インポートライブラリとしてPsapi.Libをリンクします。

関連記事



コメント (2)    この記事についてブログを書く
  • Twitterでシェアする
  • Facebookでシェアする
  • はてなブックマークに追加する
  • LINEでシェアする
« プロセスのハンドル数を取得 | トップ | プロセスのI/O操作情報を取得 »
最新の画像もっと見る

2 コメント

コメント日が  古い順  |   新しい順
ページフォールト数 (ふっさん)
2019-10-02 15:39:51
GetProcessMemoryInfoの使用例ありがとうございます.
『ページフォールト数』についてですが,ページフォール
トが発生した回数を表しているか,と思います
つまり『~個』ではなくて,『~回』ではないでしょうか.
Re:ページフォールト数 (ブログ管理人)
2019-10-15 20:35:01
> つまり『~個』ではなくて,『~回』ではないでしょうか.
確かに『回数』でしょうから『~回』が正しそうですね。
指摘!ありがとうございます。

コメントを投稿

プロセス関連」カテゴリの最新記事