PTHREADの変異がFutexよりも「遅い」と見なされるのはなぜですか?
質問
PosixミューテックスがFutexesよりも重いまたは遅いと見なされるのはなぜですか? Pthread Mutexタイプのオーバーヘッドはどこから来ていますか? Pthreadの変異はFutexesに基づいていると聞いたことがあります。その場合、Pthreadの変異は、Futexの周りの「ラッパー」にすぎないようです。
オーバーヘッドは、単に関数 - ラッパーコールとミューテックス関数がFutexを「セットアップ」する必要性(つまり、基本的にPTHREAD Mutex関数呼び出しのスタックのセットアップ)を「セットアップ」する必要がありますか?または、PTHREAD Mutexで発生している追加のメモリバリアステップがありますか?
解決
彼らは可能な限りユーザースペースにとどまるため、システム呼び出しが少ないことを意味します。これは、ユーザーモードとカーネルモードの間のコンテキストスイッチが高価であるため、本質的に高速です。
私はあなたが話していると思います カーネル スレッドPosixスレッドについて話すとき。システム呼び出しを必要としないが、他の問題を抱えているPOSIXスレッドの完全にユーザースペースの実装を持つことは完全に可能です。
私の理解では、FutexはカーネルPosixスレッドとユーザースペースPosixスレッドの途中です。
他のヒント
Futexesは、PTHREAD Mutexesのパフォーマンスを改善するために作成されました。 NPTLはFutexes、LinuxThreadsが先のFutexesを使用しています。 NPTL Mutexesには追加のオーバーヘッドがある場合がありますが、それほど多くはないはずです。
編集:実際のオーバーヘッドは基本的に次のものです。
- Mutex Typeの正しいアルゴリズム(通常、再帰、適応、エラーチェック、通常、堅牢、優先度のハルダンス、優先度の保護)の正しいアルゴリズムを選択します。ここで、コードは通常のMutexを使用している可能性が高いコンパイラに重く示唆しています(したがってCPUのブランチ予測ロジックにそれを伝える必要があります)、
- そして、ミューテックスの現在の所有者の書き込みは、通常は速いはずです。これは、ロックがひどく争われていない限り、実際のロックと同じキャッシュラインに存在するため、通常は高速である必要があります。 CPUは、私たちがそれを服用してから所有者を書き込もうとするまでにロックにアクセスしました(この書き込みは通常のミューテックスに対しては不要ですが、エラーチェックと再帰ミューテックスに必要です)。
したがって、いくつかのサイクル(典型的なケース)から数サイクル +ブランチの誤評価 +追加のキャッシュミス(非常に最悪の場合)。
あなたの質問に対する簡単な答えは、Futexesが可能な限り効率的に実装されることが知られているが、Pthreadの変異はそうでない場合があるかもしれないということです。少なくとも、PTHREAD MUTEXは、ミューテックスのタイプを決定することに関連付けられているオーバーヘッドを持っています。したがって、Futexは、ほとんどの場合、PthReadの変異と同じくらい効率的になります。これまで、誰かがFutexよりも軽い構造を考え、デフォルトのMutexにそれを使用するPTHREADの実装をリリースしない限り。
技術的に言えば、PTHREAD METEXESは、Futexesよりも遅くなっていないか、速くはありません。 pthreadは単なる標準APIであるため、遅いか速いかにかかわらず そのAPIの実装.
具体的にはLinuxでは、Pthread MutexesがFutexesとして実装されるため、高速です。実際には、使用が非常に難しく、GLIBCに適切なラッパー機能がなく、アセンブリでは携帯用のコーディングが必要なため、Futex API自体を使用したくありません。幸いなことに、GLIBCメンテナーは、Pthread Mutex APIのボンネットの下で、すでにこのすべてをコード化しています。
現在、ほとんどのオペレーティングシステムからです Futexesを実装しませんでした 次に、プログラマーは通常、PTHREAD Mutexによって意味することを意味します。これは、PTHREAD Mutexesの通常の実装から得られるパフォーマンスです。これは遅いです。
したがって、POSIXに準拠しているほとんどのオペレーティングシステムでは、PTHREADミューテックスがカーネル空間に実装され、Futexよりも遅いという統計的事実です。 Linuxでは、同じパフォーマンスを持っています。 PTHREADミューテックスがユーザースペース(コンセントのない場合)に実装されているため、パフォーマンスが向上している他のオペレーティングシステムがある可能性がありますが、この時点ではLinuxのみを知っています。
AMD64では、Futexは4バイトですが、NPTL PTHREAD_MUTEX_Tは56バイトです!はい、重要なオーバーヘッドがあります。