2016-05-29 4 views
3

"なぜこれを知る必要があるのですか?"とのコメントをお寄せください:これは私が興味があったパズルだけであり、実用的な理由で行う必要はありません。プロセス/スレッドのスケジューリング量子を実験的に決定する方法は?

典型的なPOSIXシステム[1]では、CPUバインドプロセスのスケジューリング量子[2]を決定するために実験をどのように設計しますか?

[1]:ではなく、あなたがシステムコールや/ procのインターフェイスを介してこの情報を照会することができます1

[2]:「スケジューリング量子」プロセスは、上で動作する時間の量として定義されますCPUが予定された時間が終わる前にブロッキングまたは降伏することなく、OSが別のプロセスを実行できるようにします。

+1

優先度の高いプロセスは、通常、すぐに実行されます(そうでない場合、優先度が高くなることはありません)。おそらくあなたの最後の段落で、あなたは「...予定時刻が終わり、OSが別の優先順位の高いプロセスを実行する前に」と言うことを意味しました。 –

+0

@ JeremyFriesner私は、典型的なシステムでは、タイムスライスの有効期限が切れるまでプロセスを先取りしないと考えました。私は間違っていますか? LinuxやFreeBSDではどのように動作しますか?それにかかわらず、私は質問を編集しました。 –

+0

通常、プロセスは(a)その量子が期限切れになり(同じ優先度を持つ別のプロセスが実行可能な状態)、(b)優先度の高い別のプロセスが実行可能になるまで実行されます。 (代わりに、優先度の低いプロセスが実行されているため、すぐに実行できる優先度の高いプロセスが実行されていない、優先度の逆転と呼ばれ、スケジューラの設計者が回避しようとしているもの) –

答えて

2

私はそれが可能だろうか正確にわからないんだけど、これはうまくいくかもしれない:

  1. コンピュータがアイドル状態(またはあなたがそれを作ることができるようアイドル)であることを確認してください
  2. オフスポーン2Nスレッド( Nはお使いのコンピュータのコアの数です)。これらのスレッドはすべて、同じ優先順位で実行するように設定する必要があります。
  3. 各スレッドは、高解像度タイマーを使用して現在の単調増加壁時計時間を何度も繰り返し検索する無限ループを実行する必要があります(たとえば、std :: chrono :: steady_clock :: now()または同様)。
  4. ループの各繰り返しで、各スレッドは、「突然のギャップ」の結果の時間値、すなわちクロック時間が(t)から(t + nミリ秒)にジャンプする場所を確認する必要があります.nは通常のデルタ値)。これらのギャップは、スレッドがCPUから離れてスレッドの別のスレッドが実行できる時間を示している可能性が最も高いです。
  5. ある時点で、それらのギャップのすべてのサイズの平均を計算します。これがスケジューラの量子サイズの推定値です。

これは、クロックの解像度がスケジューラの量子サイズよりも大きいことを前提としています。そうでない場合(たとえば、5mS量子長を測定するために10mS分解能のクロックを使用しようとする場合)、量子長を測定するのは難しいでしょう。

+2

これはおそらく近いですが、私はそれがシステムでスローされる可能性があると思います:std :: chrono :: steady_clock :: now ()にはシステムコールが必要です(コンテキストスイッチとスケジューリングは、タイムスライスが終了した後でなく、毎回ループを介して行われます) –

+0

システムコールは別のタスクに切り替えません。それは非常に高価なシステム設計になります。 – usr

+0

これは、ユーザーモードからカーネルモードへのコンテキストスイッチを必要とするかもしれませんが(...)http://stackoverflow.com/questions/9238326/system-call-and-context-switch –

2

は、私はあなたが以下のシステムの十分な実行の統計的分析を通じて答えを得ることができると思い:

  • 実行フラグを終了クリアプロセッサごとに1つのスレッドを、その後、一定数のためのループを実行します反復または終了フラグがセットされるまでのいずれか早い方が来ます。これらのスレッドは、すべての反復を実行したために終了したのか、終了フラグが設定されているのかを記録します。

  • 同時に、終了フラグを設定する追加のスレッドを実行します。

これをループ内のさまざまな反復回数で行います。

ループがスレッドタイムスライス内で完了すると、すべての反復が完了します。スレッドタイムスライス内で完了しない場合、終了スレッドはループスレッドの1つを中断する可能性があります。

これで、終了スレッドが最初にスケジュールされることがあり、動作を複雑にする他のスレッドが実行されることもあるので、マルチプロセッサシステムでこれを多く実行し、結果を統計的に分析する必要があります。おそらく、フラグをチェックするためにループを通る各反復でメモリ障壁が存在するため、スレッドの起動時間やメモリアクセス時間なども考慮する必要があります。

十分なループ反復制限で十分な反復を行うと、1回のタイムスライスでループを反復できる回数が増えるはずです。次に、アンロードされたシステムで多数の反復を実行して、反復ごとにかかる時間を取得し、各タイムスライスのウォールクロック時間を計算することができます。

+0

マルチプロセッサシステムでは、使用可能なプロセッサで直ちに2 /常に/実行されませんか? –

+0

@BrennanVincent良い点 - 実行中の他のスレッドがない場合、はい。私はそれに対応するために答えを調整しました。明らかにテストデザインはさらに改善されるかもしれませんが、私が提供している基本的な考えは健全だと思います。 –

関連する問題