3

C#、Java などのマネージ言語を介して Windows マシンでコンテキスト スイッチが発生すると、リッスン、検出、および何らかのアクションを実行できないことは承知しています。他の言語、おそらく C)? もしそうなら、これを行う方法のアイデアを与える小さなコードスニペットを提供できますか (私はカーネルプログラミングに比較的慣れていないため)。

このコードが本質的に行うように設計されているのは、標準の Windows UI でバックグラウンドで実行され、特定のプロセスが CPU 内外でコンテキスト スイッチされたときをリッスンすることです。これらのアクションのいずれかを聞くと、信号が送信されます。明確にするために、コンテキストスイッチではなく、特定のプロセスに直接関係するコンテキストスイッチのみを検出しようとしています。私が最終的に達成したいのは、特定のプロセスが CPU の使用を開始したときと停止したときに、(インターネット信号を介して) 別のマシンに通知できるようにすることです。

これを行う最初の試みは、特定のプロセスの CPU 使用率を単純に計算することでしたが、最終的には粗すぎるため、最も細かい計算を把握することができませんでした。たとえば、単純に演算 2+2 を実行し、答えを int 内に配置するテスト プログラムを作成しました。CPU 使用法はこれに対応していません。したがって、私はより低いレベルのものを探しているため、この質問の起源です。可能性のある代替案がある場合は、喜んで提出します。

4

2 に答える 2

4

Event Tracing for Windows (ETW)があり、システムで発生するさまざまなイベントに関するメッセージを受信するように構成できます。

スレッド スケジューリング イベントに関するメッセージを受信できるはずです。イベントのCSwitch クラスはそのためのものです。

申し訳ありませんが、タスクに簡単に再利用できる適切な ETW サンプルを知りません。MSDN を読んで周りを見回してください。

Simonは、ETW が役立つ理由を説明する適切なリンクを指摘しました。非常に啓発的です: http://randomascii.wordpress.com/2012/05/11/the-lost-xperf-documentationcpu-scheduling/

于 2012-09-25T22:03:17.243 に答える
2

以下の編集を参照してください。特に #3 では、ETW が適しているようです。

int 2Eh理論的には、古いと新しいに独自のトラップ ハンドラをインストールできますsysenter。ただし、実際には、Patchguard (Vista 以降) と署名要件のために、これは以前ほど簡単ではなくなります。コンテキスト スイッチを検出するための他の一般的な手段を認識していません。つまり、独自にロールする必要があります。OS のすべてのコンテキスト スイッチはコール ゲート (前述のトラップ ハンドラー) を通過し、ReactOS を使用すると、デバッグ/逆アセンブルが苦手な場合に舞台裏を覗くことができます。

ただし、どちらの場合も、カーネル モード権限 (通常はリング 0 と呼ばれます) なしでこのようなものをインストールする一般的な方法はありません。それ以外は、Windows のセキュリティ上の欠陥になります。あなたが望むものを達成するためのWindows提供の方法も知りません。

「文書化されていない Windows NT」という本には、正確なトピックについての非常に優れた章があります (ただし、明らかに古いint 2Eh方法を対象としています)。

特定の関数のみをフックすることに耐えられる場合は、一部のフィルター ドライバーまたはユーザー モード API のフックを回避できる可能性があります。正確な要件によって異なります。

更新:更新された質問を読んで、内部、特にIRQLの概念(DOS時代のIRQと混同しないでください)とスケジューラについて読む必要があると思います。問題は、毎秒文字通り何百ものコンテキスト スイッチが発生する可能性があり、通常は発生す​​ることです。ただし、ウォッチャー プロセス (コンテキスト スイッチを監視するプロセス) は、他のユーザー モード プロセスと同様にプリエンプト可能です。これは、リアルタイム シグナリングまたはそれに近いものを実現する方法がないことを意味し、その方法に大きな疑問符が付けられます。

あなたが実際に達成したいことは何ですか?コンテキスト スイッチの数は、実際には何も与えません。SEH 例外が発生するたびに、コンテキスト スイッチが発生します。あなたが興味を持っていることは何ですか?おそらく、パフォーマンス カウンターの方がニーズに適しているのではないでしょうか?

更新 2: 1 つのスレッドであっても、1 秒以内に驚異的な数のコンテキスト スイッチが発生します。したがって、独自のトラップハンドラーをインストールすると仮定しても、システム上の他のすべてのスレッドに (逆に) 影響を与えることになります (結局、すべてのコンテキストスイッチをキャッチし、それが関心のあるプロセス/スレッドであるかどうかを確認し、次に、あなたのことをするか、それを渡します)。

すでに定義された手段ではなく、最終的に達成したいことを教えていただければ、代替案を提案できるかもしれません.

更新 3: 明らかに、ここで 1 つの点で間違っていました。Windows には、コンテキスト スイッチを通知する機能が搭載されています。そして、ETW を利用してそれらを利用することができます。指摘してくれたサイモンに感謝します。

于 2012-09-25T18:34:39.560 に答える