POSIX mutexがfutexよりも重いまたは遅いと考えられるのはなぜですか? pthread mutexタイプのオーバーヘッドはどこにありますか? pthreadミューテックスはfutexに基づいていると聞いたことがありますが、問題がなければ、カーネルを呼び出さないでください。そのとき、pthread mutexはfutexの単なる「ラッパー」であるように見えます。
単に関数ラッパー呼び出しのオーバーヘッドと、futexを「セットアップ」するためのmutex関数の必要性(つまり、基本的にpthread mutex関数呼び出しのスタックのセットアップ)ですか?または、pthreadミューテックスでいくつかの追加のメモリバリアステップが発生していますか?
これらは可能な限りユーザー空間にとどまるので、必要なシステムコールが少なくなります。これは、ユーザーモードとカーネルモード間のコンテキストの切り替えにコストがかかるため、本質的に高速です。
POSIXスレッドについて話すとき、あなたはkernelスレッドについて話していると思います。システムコールを必要としないが、独自のその他の問題があるPOSIXスレッドの完全にユーザー空間の実装を持つことは完全に可能です。
私の理解は、futexはカーネルPOSIXスレッドとユーザー空間POSIXスレッドの中間にあるということです。
Futexは、pthreadミューテックスのパフォーマンスを向上させるために作成されました。 NPTLはfutexes、LinuxThreadsの古いfutexesを使用しています。 NPTLミューテックスには追加のオーバーヘッドがいくらかある場合がありますが、それほど多くないはずです。
編集:実際のオーバーヘッドは基本的に次のもので構成されます。
したがって、数サイクル(通常のケース)から数サイクル+ブランチの予測ミス+追加のキャッシュミス(非常に最悪のケース)。
あなたの質問への短い答えは、pthread mutexがそうであるかもしれないかそうでないかもしれない一方でfutexesが可能な限り効率的に実装されることが知られているということです。少なくとも、pthread mutexにはmutexのタイプの決定に関連するオーバーヘッドがあり、futexにはありません。したがって、誰かがfutexよりも軽い構造を考え、それをデフォルトのmutexに使用するpthread実装をリリースするまで、futexはほとんど常に少なくともpthread mutexと同じくらい効率的です。
技術的に言えば、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しか認識していません。
AMD64では、futexは4バイトですが、NPTL pthread_mutex_tは56バイトです。はい、かなりのオーバーヘッドがあります。