3

指定されたインターフェイスを実装する未知のアセンブリを動的にロードするプロジェクトがあります。インターフェイスを実装する以外に、アセンブリの内容や目的がわかりません。

これらのアセンブリで使用できる処理能力の量を何らかの方法で制限する必要があります。プロセッサの優先順位は私が探しているものではありません。サーバーが任意にビジーである可能性があるため、ストップウォッチを使用してアセンブリの実行に一定の時間を割り当てることができません。

最適には、CPU使用率の完全に負荷に依存しない測定値を指定したいと思います。必要に応じて、独自のプロセスでアセンブリを実行できます。

特定のスレッド(またはスレッドが最適ですが、プロセス)の時間の経過に伴う合計CPU使用率を何らかの方法で測定する方法はありますか?

プロセスパフォーマンスカウンターを使用するのでしょうか、それとも信頼性が低すぎるのではないかと思います。サイクルごとの精度は必要ありませんが、各アセンブリの実行に割り当てられる計算能力を制限するには、かなり高い精度が必要になります。


私の状況を少し外挿します。プロセスの優先順位付けを求めていない理由は、リソースを使い果たすことを恐れていないためです。特定のアセンブリが使用する「いくつの」リソースを測定できることを確認する必要があります。したがって、サーバーが任意であるという私のポイントです。忙しい。

2つのアセンブリXとYがあるシナリオの例を想像してみてください。それぞれが特定のアルゴリズムを実装しており、どのアセンブリが最も速くジョブを実行するかについてのプリミティブテストを実行したいと思います。各アセンブリを実行し、「Z」リソースが使用されるまで実行します。その時点で、どのアセンブリが最適な作業を行ったかを評価します。この場合、一方のアセンブリが100%CPUで3秒間実行され、もう一方のアセンブリが5分間で2%CPUで実行されるかどうかは関係ありません。重要なのは、リソースの合計使用量です。

CPU時間perfcounterを使用して大まかな制限を行うことができるかもしれないと思っています。新しいスレッドで各アセンブリを実行し、所定のCPU時間を使用するまで実行します。その時点で、プロセスを強制終了して結果を評価します。私はそれが十分に正確ではないのではないかと心配しています。

4

3 に答える 3

1

ほとんどのX86オペレーティングシステムが機能する方法は、プリエンプティブスレッドスケジューリングを使用することです。OSはマザーボード上のタイマーを初期化し、100msごとにプロセッサに割り込みを送信します。(これは実行スライスです。通常、計算量の多いプログラムは、この制限の前に待機キューに入れられるものを待機し始める必要があります。)プロセッサが割り込みを受け取ると、実行をOSカーネルに切り替えます。

したがって、シングルコアシステムでのスレッドの実行をこのタイマーよりも細かいものに制限することは技術的に不可能です。

「公平な」スケジューリングを使用すると、(電力の節約に関心がないため)回転するマネージャーを使用して、それぞれのスレッドの実行時間を調べ、実行時間が長すぎる場合はスレッドを終了することができます。

于 2008-10-27T16:55:46.250 に答える
1

これに優先順位を使用できない (すべきではない) とあなたが考える理由が知りたいです。Microsoft の人々は、すべてのスレッド/プロセスに CPU を均等に使用するタスク スケジューラの開発に非常に長い時間を費やしてきました。マシンで優先度の高いプロセスが実行されていて、プログラム/サードパーティの dll がその他のプログラムに影響を与えたくない場合は、優先度を他のプログラムよりも低く設定するだけで済みます。そのための優先事項です。あなたのプログラムが 100% で CPU を最大限に活用している場合でも、他のプログラムは、優先度が同じ場合でも、実行したいときにプロセスまたはスレッドを置き換えますが、特に優先度が高い場合はそうです。

それでも解決しない場合は、PerformanceCounterまたは Win32 API を使用してプロセス/スレッドを監視し、しきい値を超えたときに Thread.Sleep を使用する必要があります。これは面倒すぎるようです。

より良いオプション (IMO) は、カスタム スレッドプールを使用して、スレッドの最大数を構成し、ロードするアセンブリごとにスレッドをキューに入れ、優先度を通常より 1 つ低く設定し、生成されるスレッドの最大数を監視して決定することです。希望するパフォーマンス制限。非常に優れたカスタム スレッドプールがここにあります。(.NET スレッドプールでは制限ができないため、カスタム スレッドプールを使用する必要があります。)


マルチ CPU マシンで実行している場合の別のオプションは、アフィニティを使用してプログラムを特定のコアに制限することです。たとえば、4 コアのマシンでプログラムを core3 に制限すると、プログラムが暴走してその CPU が最大になり、システムの残りの部分には高可用性を維持するために 3 つのコアが残ります。

于 2008-10-25T20:31:39.200 に答える
1

Terrarium は、 http://www.codeplex.com/terrarium2 をご覧になることをお勧めします

残念ながら、DLL をロードする AppDomain を構成するだけでは、これを行う簡単な方法はないと思います。おそらく、Terrarium の機能を再実装する必要があります。

于 2008-10-25T18:25:39.080 に答える