7

ここに私が理解していることがあります。それを修正/追加してください:並行実行に関して、ユーザーレベルスレッド(ULT)とカーネルレベルスレッド(KLT)はどのように異なるのですか?

純粋なULTでは、マルチスレッドプロセス自体がスレッドスケジューリングを行います。したがって、カーネルは本質的にその違いに気付かず、それをシングルスレッドプロセスと見なします。 1つのスレッドがブロッキングシステムコールを行うと、プロセス全体がブロックされます。 マルチコアプロセッサであっても、プロセスがブロックされていない限り、一度に1つのスレッドしか実行されません。 ULTがどのように役立っているのかよくわかりません。

純粋なKLTでは、スレッドがブロックされていても、カーネルは同じプロセスの別の(準備完了の)スレッドをスケジュールします。 (純粋なKLTの場合は、カーネルがプロセスのすべてのスレッドを作成すると仮定しています)。

また、ULTとKLTの組み合わせを使用すると、ULTはどのようにKLTにマッピングされますか?

答えて

17

あなたの分析は正しいです。 OSカーネルには、ユーザーレベルのスレッドに関する知識はありません。その観点からは、プロセスは時にはシステムコールを行う不透明なブラックボックスです。したがって、そのプログラムに100,000のユーザーレベルのスレッドがあるが、1つのカーネルスレッドしかない場合、そのプロセスにはカーネルレベルのスレッドが1つしか関連付けられていないため、一度に1つしかユーザーレベルのスレッドを実行できません。一方、プロセスに複数のカーネルレベルのスレッドがある場合、マルチコアマシンが存在する場合、並列に複数のコマンドを実行できます。

これらの共通の妥協点は、プログラムがいくつかの固定数のカーネルレベルのスレッドを要求し、独自のスレッドスケジューラがユーザーレベルのスレッドをこれらのカーネルレベルのスレッドに適切に分割させることです。このように、複数のULTを並列に実行することができ、プログラムはスレッドの実行方法をきめ細かく制御できます。

このマッピングの仕組みについては、さまざまなスキームがあります。ユーザープログラムが複数の異なるスケジューリングシステムのいずれかを使用していると想像することができます。実際には、あなたがこの置換を行う場合:

カーネルスレッド< --->プロセッサコア

ユーザースレッド< --->次に、カーネルスレッド

OSを使用することができます任意のスキームカーネルスレッドをコアにマップすることも、ユーザーレベルのスレッドをカーネルレベルのスレッドにマップするために使用できます。

希望すると便利です。

+0

しかし、いくつかのサイトや書籍によれば、ULTはマルチプロセッシングを利用することはできず、あなたの行の1つは「プロセスに複数のカーネルレベルのスレッドがある場合、複数のコマンドをマルチコアマシンがあれば並行」どこが間違っていますか? – Garrick

+0

あなたはそれへのリンクを提供できますか?それは間違って聞こえる。 – templatetypedef

+0

これらの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

2

何よりも前に、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つの方法があります(私が思いつくことができます)。

  1. すべて KLTの

    このような状況のためULTののコレクションは、共有メモリシステム上で理想的です。各KLTがアクセスできるULTの「プール」が基本的にあります。理想的には、スレッドライブラリスケジューラは、要求に応じてKLTがプールに個別にアクセスするのではなく、各KLTにULTを割り当てることが理想的です。後で、ロックなどで実装されていないと競合状態やデッドロックが発生する可能性があります。

  2. ULTの KLT(Qthreads

    のためのコレクションこの状況は、分散メモリシステム上で理想的です。各KLTには、実行するULTのコレクションがあります。引き戻されるのは、ユーザ(またはスレッドライブラリ)がKLT間でULTを分割する必要があるということです。これは、すべてのULTがほぼ同じ量の作業を完了しておおよそ同じ時間を完了することが保証されていないため、負荷の不均衡が生じる可能性があります。このソリューションは、ULTの移行を可能にしています。つまり、KLT間のULTの移行です。

+0

私は "ハイブリッドスレッド"を実装する他のサンプルライブラリ/ APIを探しています。誰もが何かを知っている場合は、コメントや編集を自由にしてください。 –

+0

+1これは他人のために長く書いた痛みです。 Pthreadライブラリはハイブリッドスレッドの例ではありませんか? –

+0

オリジナルのLinux PThreadsライブラリと、IBMがサポートする代替NGPT(Next Generation POSIX Threads)は、m:nスレッド実装でした。しかし、Linus Torvalds氏は、Linuxカーネルスレッドが太すぎると、ユーザー空間の複雑さを上回る複雑さを排除するのではなく、現在のNPTL(ネイティブPOSIX Threading Library)が1:1のライブラリです。 BEAM Erlang VMでは、CPUコアごとに1つのVMが起動され、それぞれが別のスレッドで起動され、Erlangプロセスがそれらの間でスケジュールされます。 –

関連する問題