前回のエントリに続いて、今回は実行中に自分自身のメモリ使用情報を取得する方法についてメモ。
検証、プロファイリング、メモリ容量に合わせたアルゴリズムの選択処理などを行うために、実行中に自分自身が使用しているメモリサイズやそのピークサイズを取得したい場合がある。
その実装手段はいくつかあるのだけれど、まず各OSごとのシステムコールを使うと取得できる場合がある。例えばlinuxだと、getrusage()を使用すると各種メモリ情報を取得できる。サンプルコードは以下の通り。
/** getrusage()を使った最大駐在ページサイズの取得と表示 */ void use_getrusage(void) { struct rusage r; if (getrusage(RUSAGE_SELF, &r) != 0) { /*Failure*/ } printf("maxrss=%ld\n", r.ru_maxrss); }
また、linuxやunixなら「/proc/[PID]/status」を参照すれば各種メモリ情報を取得できる。そのため単純に情報を標準出力に出力したい場合は、「/proc/[PID]/status」からgrepで必要な情報を取得するコマンドをsystem()で実行すれば良い。なお[PID]はgetpid()で取得できる。
#define MAX_STRING 128 /** system()で/proc/[PID]/statusから物理メモリサイズのピーク値を検索し出力するコマンド実行 */ void use_system(void) { char command[MAX_STRING]; sprintf(command, "grep VmHWM /proc/%d/status", getpid()); system(command); }
なお結果を標準出力に出力するのでなく、アプリケーション内で取得したいならば、popen()で先ほどのコマンドを実行する。出力を文字列として受け取れるので、その文字列からsscanf()やsstreamで中の数値を読みだせば、メモリ情報を取得できる。
#define MAX_STRING 128 /** popen()で/proc/[PID]/statusから使用仮想メモリサイズを検索・出力するコマンドを実行し、結果習得 */ void use_popen(void) { FILE *fp; char command[MAX_STRING]; char output[MAX_STRING]; sprintf(command, "grep VmSize /proc/%d/status", getpid()); if ((fp = popen(command, "r")) == NULL) { /*Failure*/ return; } while (fgets(output, MAX_STRING, fp) != NULL) { //具体的な数値を取得する場合は、sscanf等で読み出し printf("%s", output); } if (pclose(fp) == -1) { /*Failure*/ } }