何よりも前に、templatetypedefの答えは美しいです。彼の反応を少しだけ広げたいと思っていました。
少し拡大する必要があると感じた領域が1つあります:ULTとKLTの組み合わせです。
利用可能な論理コアより多くのKLTがあるマルチスレッドプログラム(複数のKLT)を考えてみましょう。あなたが言及したように、すべてのコアを効率的に使用するために、スケジューラは、ブロックされていないKLTを、準備状態でブロックしていないものでスイッチアウトする必要があります。これにより、コアがアイドル時間の量を減らすことが保証されます。残念なことに、KLTの切り替えはスケジューラにとって高価であり、比較的長いCPU時間を消費する。
これは、ハイブリッドスレッドが役立つ1つの領域です。複数のKLTとULTを持つマルチスレッドプログラムを考えてみましょう。 templatetypedefと記載されているように、各KLTに対して一度に実行できるULTは1つだけです。 ULTがブロックしている場合は、まだブロックしていないものに対しては、それを切り替える必要があります。幸いにも、ULTは、ULTに割り当てられるリソースが少なく、カーネルスケジューラとのやりとりを必要としないという点で、KLTよりはるかに軽量です。基本的には、KLTを切り替えるよりも、ULTのスイッチを切るほうが、いつもより早いです。結果として、最初の例と比較して、コアアイドル時間を大幅に短縮することができます。
もちろん、これはすべて、ULTの実装に使用されているスレッドライブラリに依存します。 ULTをKLTに「マッピング」するには2つの方法があります(私が思いつくことができます)。
すべて KLTの
このような状況のためULTののコレクションは、共有メモリシステム上で理想的です。各KLTがアクセスできるULTの「プール」が基本的にあります。理想的には、スレッドライブラリスケジューラは、要求に応じてKLTがプールに個別にアクセスするのではなく、各KLTにULTを割り当てることが理想的です。後で、ロックなどで実装されていないと競合状態やデッドロックが発生する可能性があります。
ULTの各 KLT(Qthreads)
のためのコレクションこの状況は、分散メモリシステム上で理想的です。各KLTには、実行するULTのコレクションがあります。引き戻されるのは、ユーザ(またはスレッドライブラリ)がKLT間でULTを分割する必要があるということです。これは、すべてのULTがほぼ同じ量の作業を完了しておおよそ同じ時間を完了することが保証されていないため、負荷の不均衡が生じる可能性があります。このソリューションは、ULTの移行を可能にしています。つまり、KLT間のULTの移行です。
しかし、いくつかのサイトや書籍によれば、ULTはマルチプロセッシングを利用することはできず、あなたの行の1つは「プロセスに複数のカーネルレベルのスレッドがある場合、複数のコマンドをマルチコアマシンがあれば並行」どこが間違っていますか? – Garrick
あなたはそれへのリンクを提供できますか?それは間違って聞こえる。 – templatetypedef
これらの2つのリンクを確認してください。http://stackoverflow.com/questions/25582876/what-does-it-mean-by-user-threads-cannot-take-advantage-of-multithreading-or-muおよびhttp:// cs.stackexchange.com/questions/1065/what-is-the-difference-between-user-level-threads-and-kernel-level-threads。 2番目のリンクの最後の行はそれを示しています。私はもう少し調べて、それは1:1モデルに依存していると思います。重要な情報が不足している場合は、私を修正してください。ありがとう!! – Garrick