2017-08-20 15 views
3

私はC++ ThreadPoolの移植を行い、作業者のmain関数でpthread_cond_waitを使用しています。私は、それを待っているスレッド/スレッドが起きるまで、条件変数に信号を送ることからどれくらいの時間が経過するのだろうと思っていました。 この時間を見積もり/計算する方法はありますか?pthread_cond_waitがシグナル通知された後にスリープ待機中にスレッドが待機するのにどれくらいの時間がかかりますか?この時間をどのように見積もることができますか?

ありがとうございました。

+1

OS(およびOSバージョン)に固有のものです。 OSスケジューラがスレッドを起動させるのにかかる時間は、C++の範囲外です。 –

+0

@RichardCrittenシステムボードとCPUに固有のもので、システム負荷とその優先順位設定に特有のものと、さまざまな割り込みの到着などの計算の最下位桁を混乱させるリアルタイム変数と、寒さはキャッシュとそれ以外のものです。 – Kaz

答えて

4

それはコンテキストスイッチOS上

  1. のコストに、依存、
  2. それはスレッドであるCPU又は異なるプロセス
  3. 機の負荷
  4. スイッチが最後に実行されたのと同じコアになります
  5. ワーキングセットサイズは何ですか
  6. 最後に実行されてからの時間

Linuxの場合、i7,1100ns、同じプロセス内のスレッド、最後に実行されたコアと同じコア、最後のスレッドとして実行され、無負荷、ワーキングセット1バイト。

悪いケース、キャッシュからフラッシュ、別のコア、別のプロセス、ちょうど30μsのCPUオーバーヘッドが必要です。

コスト行きます

:異なるプロセス、フラッシュTLBは、3〜5ページをリロードする場合

  1. 保存最後のプロセスコンテキスト70から400サイクル、
  2. 負荷新しいコンテキスト100-400サイクル
  3. を歩くことができます。潜在的には、それぞれ約300サイクルの記憶があります。さらに、指示やデータを含め、複数のページに触れた場合は、いくつかのページが表示されます。
  4. OSオーバーヘッド、私たちはすてきな統計を気に入っています。たとえば、コンテキストスイッチカウンタに1を加えます。
  5. スケジューリングオーバーヘッド次に実行するタスク
  6. 新しいコアで潜在的なキャッシュミス〜自分のL2キャッシュのキャッシュラインあたり12サイクル。そこからデータが遠く離れていくほどそこから下り坂になります。
+0

右の音。 Windowsでは、あるイベントでしばらく待っていた「not-much-data」スレッドを実行すると、3〜7usかかる(「すぐに実行できるコア」があると仮定して)。 –

関連する問題