ページ 11

物理メモリの使用率を取得

Posted: 2010年3月29日(月) 11:01
by Ma
いつもおせわになってます。
環境:Visual C++ 2008 Express です。
(DXライブラリ使っています。)

http://blog.goo.ne.jp/masaki_goo_2006/e ... bec37f8695

CPUと物理メモリの使用率を取得しようとおもっていたのですが、CPUはできたものの物理メモリがよくわかりません。

自分なりに「メモリ 使用率 取得 C++」のようなキーワードで見つけたのが↑のURLなんですが、
取得できた値は以下のとおりでした。

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


これって、結局この方法では物理メモリの使用率は算出できないということなんでしょか・・・?
ほしい値は、タスクマネージャーで表示されるグラフに使われるような物理メモリの使用率です。

つまり、質問内容は
物理メモリの使用率の取得の仕方を教えてください。
です。

よろしくお願いします。


//以下、私が考え見た推測なんですが、失敗したので蛇足です。


XPのタスクマネージャーでは、7で物理メモリの使用量とかかれている場所と同じところに「ページファイルの使用量」と書いてあったので、
ページファイルの使用率 = 物理メモリの使用率
なのかな。と勝手に想像してみて
物理メモリの使用率 = (4)現在ページプールの使用サイズ(ページ プール) / (5)最大ページプールの使用サイズ
・・・?
とおもって、チェックしてみたらタスクマネージャーとぜんぜん違う値が出ました。 画像

Re:物理メモリの使用率を取得

Posted: 2010年3月29日(月) 12:04
by tk
APIにGlobalMemoryStatusという関数があったと思います。

使い方はうろ覚えなんで申し訳ないんですが、
GlobalMemoryStatusにLPMEMORYSTATUS構造体を渡すと各情報が構造体に得られますので、
その中の「dwTotalXXXXXX」から「dwAvailXXXXXX」を引けば、使用量が求められます。
(「XXXXXX」はスペルが思い出せません・・・)

間違っていたらすいません。

Re:物理メモリの使用率を取得

Posted: 2010年3月29日(月) 12:35
by Ma
**
この問題は自己解決しました。
このレスは読まないで、次のレスを読んでください。
**


MSDNで
>4GB を超えるメインメモリを実装したコンピュータでは、GlobalMemoryStatus 関数は誤った情報を返す可能性があります
とあったので、
GlobalMemoryStatusEx
を使おうと思うのですが、

対応情報
Windows NT/2000:Windows 2000
Windows 95/98:対応していません
Windows CE:対応していません
ヘッダーファイル:winbase.h 内で宣言
インポートライブラリ:kernel32.lib を使用


とあって、XP、Vista,7 についてはわからず。。。。


ともかく試してみると間違った値がかえってきました。

MEMORYSTATUSEX memBuf;
GlobalMemoryStatusEx(&memBuf);
#define CHANGE_TO_MEG(VAL) (VAL/(DWORDLONG)1024/(DWORDLONG)1024)
printfDx("MEM %d %d\n",CHANGE_TO_MEG(memBuf.ullAvailPhys),CHANGE_TO_MEG(memBuf.ullTotalPhys));
printfDx("TOTAL AVAI %d\n",memBuf.ullAvailPhys);

memBuf.ullTotalPhys は、6GB前後、memBuf.ullAvailPhys3GB前後
になる予定だったんですが。。。(タスクマネージャーより。)

オーバーフローなのか、、、正常な値が帰ってきませんでした。

-858993460 3276
TOTAL AVAI -858993460


↑結果こんなかんじでした。 画像

Re:物理メモリの使用率を取得

Posted: 2010年3月29日(月) 12:46
by Ma
>tkさん
ありがとうございます。
なんで、これがヒットしなかったのかなぞです。。。。
単にメモリと検索せずに、物理メモリと検索すればよかったのでしょかねw


ともかく、
MEMORYSTATUSEX memBuf = { sizeof(MEMORYSTATUSEX) };
GlobalMemoryStatusEx( &memBuf );

#define CHANGE_TO_MEG(VAL) (VAL/1024/1024)
printfDx("MEM:%d %d %d\n",memoryFree,(int)CHANGE_TO_MEG(memBuf.ullAvailPhys),(int)CHANGE_TO_MEG(memBuf.ullTotalPhys));

上記の方法でうまく成功できました。
ありがとうございました。 画像