ユーザーレベルのスレッドはカーネルレベルのスレッドにどのようにマップされますか?
2 に答える
実装によって異なります。最も一般的な 3 つのスレッド モデルは次のとおりです。
1 対 1: 各ユーザーレベルのスレッドには、カーネルによってスケジュールされた対応するエンティティがあります。
n 対 1: 各プロセスはカーネルによってスケジュールされます。スレッドのスケジューリングは、完全にユーザー空間で行われます。
n-to-m: 各プロセスには、カーネルによってスケジュールされたエンティティのプールがあります。これらは、プロセスの一部であるユーザー空間スケジューラによって特定のユーザーレベルのスレッドを実行するために割り当てられます。
最新の実装は、ほぼすべて 1 対 1 です。
ULT と KLT を参照するために使用される用語については、少し混乱があります。以下は、2 つの異なる解釈です。これが間違っている場合は修正してください:
KLT は、カーネルで並行性を実現するために必要です (カーネルをプロセスまたはライブ エンティティとして解釈することに注意してください)。これは、カーネル スレッドがシステムのすべてのハードウェア リソース (ファイル サーバー、ロケーション サーバー、カレンダー サーバーなど) を担当する Symbian などのマイクロ カーネルに当てはまります。ただし、大部分がライブラリである Linux のようなカーネル (それ自体がプロセスや生きているエンティティではない) では、カーネル スレッドにはまったく意味がありません。Linux では、作成したすべてのスレッドがカーネルによってプロセスとして扱われ、カーネルは常にプロセス コンテキストまたは割り込みコンテキストのいずれかで実行されます。
2 番目の解釈は、スレッド化 (または並行性) がカーネルから見えるかどうかに基づいています。たとえば、setjmp、longjmp を使用すると、ユーザー空間で同時実行を実現できます。すでに説明したように、カーネルはこれをまったく認識していません。この同時実行性は、ULT と呼ばれることがあります。また、カーネルが作成を認識しているスレッド (Clone() システム コールを使用するスレッド) は、KLT と呼ばれる場合があります。