2011-06-20 7 views
2

Windows C++プログラムで発生したハードページフォールトの数を読み取ることができますか?プログラムは管理者として実行されていません。 編集に追加:明らかに、私はシステム全体の総ページフォルトカウントには興味がありません。プログラムでWindowsのプログラムのページフォルトカウントを読み取る

ETWがカウンタをエクスポートする可能性がありますが、私はAPIを把握するのが非常に難しく、管理者と比較して一般ユーザーがアクセスできるものは明確ではありません。

誰にもこの機能の例がありますか?それとも、Windows上では不可能なのでしょうか?

(?。OTが、それは、これは* nixの上でどのようにはるかに簡単に悲しいではありませんgerusage()と設定が完了している)

+1

Windowsはこれらの統計情報を公開していないようです。 – Luke

+1

@ルーク - 答えとして投稿した場合、私はそれを受け入れるだろう。 –

答えて

4

afaiは、ETW(Windowsのイベントトレース)を使用してカーネルのハードページフォールトを監視することができます。イベントペイロードには、実行中のプロセスごとのカウントを生成するために、既存のプロセスと相関する可能性のあるスレッドIDがあります(これは軽微ではありません)。プロセスごとに履歴情報を取得する方法はありません。

Process Explorerはプロセスごとの表示でページフォールト(ソフトまたはハード)のみをサポートしているため、これは難しい問題です。

http://msdn.microsoft.com/en-us/magazine/ee412263.aspx

求めアウト ページテーブルエントリが無効な場合、ページフォールトが発生します。 要求されたページがディスクから に提起する必要がある場合、それはハードページフォールト (非常に高価な操作)、 と呼ばれ、他のすべての種類は ソフトページフォールト(安価 動作)と考えられています。ページフォールトイベントのペイロード は、仮想メモリのページフォールトが起こっているのアドレス と にそれを引き起こした命令ポインタが含まれています。ハードページフォールトは、ファイルまたは 内のコンテンツへの 最初のアクセスが がページアウトされたメモリブロックにアクセスすることができた、発生するディスク アクセスが必要です。ページフォールトイベントを有効にする ハードページフォールトをハードウェアタイプのページフォールトとして に記録します。しかし、ハード障害は、一般的に は パフォーマンスにかなり大きな影響力を持っているので、別のイベントは、ちょうど が独立して有効にすることができるというハードの故障のために利用可能 です。 A Hard フォールトイベントペイロードには、ページフォールトイベントと比較して、ファイルキー、オフセット、スレッド IDなど、より多くのデータ( )があります。

+0

プロセスエクスプローラにはパフォーマンスカウンタが使用されていると言えます。なぜなら、ハードとソフトのページフォルトが表示されているからです。私はETWを使ったことはありませんでしたが、私が読んできたことから、はるかに強力であるように見えます。 –

+0

@Dave - はい、ETWはPerfカウンターより優れていますが、使用するのがさらに難しいです。 –

2

私はあなたがGetProcessMemoryInfo()を使用することができると思う - のためhttp://msdn.microsoft.com/en-us/library/ms683219(v=vs.85).aspxを参照してください詳しくは。

+0

concensusは、これがソフトページフォールトの数であることです。ここを参照してください。 http://glandium.org/blog/?p=1963 –

1

はい、かなり悲しいです。それとも、Windowsがそんなに気にならないと仮定しても、ページフォールトカウンタを提供せずにそれを探すことさえできません:Win32_PerfFormattedData_PerfOS_Memory

+0

私はプロセスごとの情報ではなく、システム全体に情報を与えることを理解しました。 http://glandium.org/blog/?p=1963私は間違っていますか? –

1

これは、ウィンドウでperformance countersで行われます。私は何かをしてからしばらくしている。私はあなたがそれらを照会するために管理者として実行する必要があるかどうかを思い出さない。

[編集] 私が提供するコード例を持っていませんが、this pageによると、あなたが特定のプロセスのために、この情報を取得することができます:

プロセス:ページフォルト/秒。これは、この特定のプロセスからの 要求のために発生したページ フォルトの数の の指示です。 特定のプロセスからの過度のページフォルトは、通常は悪いコーディングの例である と表示されます。 関数とDLLのいずれかが正しく構成されていないか、アプリケーションが使用しているデータセット が効率が悪い という方法で呼び出された です。

+1

残念ながら、それはソフトとハードのページフォルトの合計だと思います。 –

1

パフォーマンスカウンタを読み取る方法を説明し、Microsoftのサイト上でのC/C++のサンプルがあります:INFO: PDH Sample Code to Enumerate Performance Counters and Instances

あなたは/それを貼り付け、私はあなたが「メモリ」によって、興味を持っていると思う/「ページをコピーすることができます

この興味深い記事に記載されているように、「Reads/sec」カウンタを使用します。The Basics of Page Faults

+0

アプリケーションごとの情報をこのように取得することはできますか?これは、システム全体のデータだけを提供するように見えます。 –

+1

@ジャスティン - うーん...私はあなたの質問でその部分を逃した。 Perfmonを使用してパーフォーマンスカウンタを参照すると、「プロセス」カテゴリの「ページフォルト/秒」しか表示されないため、そうは思わないでしょう。文書化されていないapis(NtQueryInformationProcess、VM_COUNTERS)はそれをしません。関連する別のスレッドを見てください:http://www.cpplc.net/forum/index.php?topic=580.0 –

関連する問題