web-dev-qa-db-ja.com

pthread mutexがfutexより「遅い」と考えられているのはなぜですか?

POSIX mutexがfutexよりも重いまたは遅いと考えられるのはなぜですか? pthread mutexタイプのオーバーヘッドはどこにありますか? pthreadミューテックスはfutexに基づいていると聞いたことがありますが、問題がなければ、カーネルを呼び出さないでください。そのとき、pthread mutexはfutexの単なる「ラッパー」であるように見えます。

単に関数ラッパー呼び出しのオーバーヘッドと、futexを「セットアップ」するためのmutex関数の必要性(つまり、基本的にpthread mutex関数呼び出しのスタックのセットアップ)ですか?または、pthreadミューテックスでいくつかの追加のメモリバリアステップが発生していますか?

42
Jason

これらは可能な限りユーザー空間にとどまるので、必要なシステムコールが少なくなります。これは、ユーザーモードとカーネルモード間のコンテキストの切り替えにコストがかかるため、本質的に高速です。

POSIXスレッドについて話すとき、あなたはkernelスレッドについて話していると思います。システムコールを必要としないが、独自のその他の問題があるPOSIXスレッドの完全にユーザー空間の実装を持つことは完全に可能です。

私の理解は、futexはカーネルPOSIXスレッドとユーザー空間POSIXスレッドの中間にあるということです。

8
Nektarios

Futexは、pthreadミューテックスのパフォーマンスを向上させるために作成されました。 NPTLはfutexes、LinuxThreadsの古いfutexesを使用しています。 NPTLミューテックスには追加のオーバーヘッドがいくらかある場合がありますが、それほど多くないはずです。

編集:実際のオーバーヘッドは基本的に次のもので構成されます。

  • ミューテックスのタイプ(通常、再帰的、適応的、エラーチェック、通常、堅牢、優先度継承、優先度保護)に適切なアルゴリズムを選択し、コードが通常のミューテックスを使用している可能性が高いことをコンパイラーに強く示唆している(したがってそれをCPUの分岐予測ロジックに伝える必要があります)、
  • mutexの現在の所有者の書き込み。通常は高速なはずのmutexを取得した場合、ロックは非常に競合している場合を除いて、取得した実際のロックと同じキャッシュラインにあるため、 CPUは、取得してから所有者を書き込もうとしたときにロックにアクセスしました(この書き込みは、通常のmutexでは不要ですが、エラーチェックと再帰的mutexには必要です)。

したがって、数サイクル(通常のケース)から数サイクル+ブランチの予測ミス+追加のキャッシュミス(非常に最悪のケース)。

30
ninjalj

あなたの質問への短い答えは、pthread mutexがそうであるかもしれないかそうでないかもしれない一方でfutexesが可能な限り効率的に実装されることが知られているということです。少なくとも、pthread mutexにはmutexのタイプの決定に関連するオーバーヘッドがあり、futexにはありません。したがって、誰かがfutexよりも軽い構造を考え、それをデフォルトのmutexに使用するpthread実装をリリースするまで、futexはほとんど常に少なくともpthread mutexと同じくらい効率的です。

14
David Schwartz

技術的に言えば、pthreadミューテックスはfutexesより遅くも速くもありません。 pthreadは単なる標準APIであるため、低速か高速かはそのAPIの実装に依存します。

特にLinuxでは、pthreadミューテックスはfutexとして実装されているため、高速です。実際、futex API自体は使用するのが非常に難しく、glibcに適切なラッパー関数がなく、移植できないアセンブリでのコーディングが必要であるため、使用しないでください。幸いなことに、glibcのメンテナは、pthreadミューテックスAPIの内部ですでにこれらすべてをコーディングしています。

現在、ほとんどのオペレーティングシステムfutexesを実装していませんでしたなので、プログラマーは通常、pthread mutexによって、通常のpthread mutexの実装から得られるパフォーマンス、つまり低速を意味します。

したがって、POSIX準拠のほとんどのオペレーティングシステムでは、pthreadミューテックスがカーネルスペースに実装されており、futexよりも低速であるというのは統計的な事実です。 Linuxでも同じパフォーマンスです。他のオペレーティングシステムでは、pthreadミューテックスがユーザー空間で実装されており(競合しない場合)、パフォーマンスが向上している可能性がありますが、現時点ではLinuxしか認識していません。

11
Mark Veltzer

AMD64では、futexは4バイトですが、NPTL pthread_mutex_tは56バイトです。はい、かなりのオーバーヘッドがあります。

1
user696732