12

これが私が理解していることです。修正/追加してください:

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

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

また、ULT と KLT の組み合わせを使用して、ULT はどのように KLT にマップされますか?

4

2 に答える 2

22

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

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

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

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

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

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

お役に立てれば!

于 2013-02-09T21:52:42.543 に答える