4

問題のマシンで未使用の実行リソースが使用可能であると仮定します。つまり、すべての CPU が使用されているわけではありません。スレッドが条件変数を待機している場合、このスレッドのウェイクアップに関連するコストはどれくらいですか? 同様に、条件変数の待機に関連するコストはどれくらいですか? 大まかな定量化とコストの発生源の両方に興味があります。答えが「場合による」である限り、私は主に x86/x64 上の Windows と Linux の最近のバージョンに関心があります。

編集: カーネル呼び出しが関係しているため、カーネル呼び出しは通常の関数呼び出しよりもどれくらい高価ですか?

4

3 に答える 3

2

pthreads や D の実装に関する詳細はわかりませんが、一般的に言えば、条件変数の最適なオーバーヘッドは、カーネル呼び出しが 1 回余分に発生し、コンテキスト スイッチが発生する可能性があることです。

典型的な実装は、イベントとミューテックスの単なるラッパーであるため、オーバーヘッドとタイミングは、これらのカーネル オブジェクトの動作によって特徴付けることができます。待機中、スレッドはスケジュールされたタイム クォンタムの残りを放棄し、起動時にスレッドはカーネルによってスケジュールされ、優先度に基づいて次に利用可能なタイム クォンタムを取得します。これは、負荷とカーネル構成に大きく依存しますが、通常は数ミリ秒以内です。

条件変数の場合、ミューテックスを再取得するという追加のタスクがあり、もちろんブロックされる可能性があります。ブロックしない場合、それはまだカーネル呼び出しです。これは、比較すると非常に高速ですが、単一のプロセスに限定されている少数のアトミック CPU 命令に最適化される可能性があります。[ed: たとえば、Win32 の CRITICAL_SECTION または Linux の futex。]

最悪のケースは、条件変数が誤ってトリガーされ、スレッドがウェイクアップして何もすることがないことを発見することですが、これは通常、総オーバーヘッドのごく一部を占めています。

于 2011-04-20T20:24:13.450 に答える
0

最後の質問に答えるには:

カーネル呼び出しが関係しているため、カーネル呼び出しは通常の関数呼び出しよりもどれくらい高価ですか?

はい、約1000倍高価です。

于 2011-09-29T13:40:06.910 に答える
0

これはあなたの質問に関連していますが、あなたが探している答えではないと思います。

シグナルとミューテックス/条件のベンチマークを行い、どのメソッドがスレッドをより速くスリープおよびウェイクできるかを確認しました。シグナルについては、sigwait() を使用してサスペンドし、pthread_kill を使用してウェイクしました。ミューテックス/条件については、スレッドごとに 1 つのミューテックスと 1 つの条件を使用しました。シグナルを使用すると、スレッドを 5 倍速くスリープおよびウェイクできることがわかりました。

futex はテストしませんでした。

于 2011-04-25T23:51:25.727 に答える