比較に入る前に、まずスレッドとは何かを理解しましょう。スレッドは、独立したプロセスのドメイン内の軽量プロセスです。プロセスが重く、多くのリソースを消費し、さらに重要なことに、
2 つの別個のプロセスがメモリ空間を共有することはできません。
テキスト エディタを開いたとします。これは、独立したアドレス指定可能な場所でメモリ内で実行される独立したプロセスです。このプロセスには、グラフィックの挿入、スペル チェックなど、多くのリソースが必要です。これらの機能ごとに個別のプロセスを作成し、メモリ内に個別に維持することは現実的ではありません。これを避けるには、
単一のプロセス内に複数のスレッドを作成でき、プロセス内に独立して存在する共通のメモリ空間を共有できます。
それでは、質問に 1 つずつ戻ります。
ユーザーレベルのスレッドとカーネルレベルのスレッドの違いについてはよくわかりません。
スレッドは、実行ドメインに基づいて、ユーザー レベルのスレッドとカーネル レベルのスレッドに大別されます。1 つまたは複数のユーザー スレッドが 1 つまたは複数のカーネル スレッドにマップされる場合もあり ます。
- ユーザーレベルのスレッド
ユーザー レベルのスレッドは、アプリケーションがメイン メモリでの実行を維持するためにこれらのスレッドを作成するアプリケーション レベルにあることがほとんどです。必要な場合を除き、これらのスレッドはカーネル スレッドとは独立して動作します。
これらは、多くのレジスタを参照する必要がなく、コンテキストの切り替えがカーネルレベルのスレッドよりもはるかに高速であるため、作成が簡単です。
ユーザー レベルのスレッドは、ほとんどの場合、アプリケーション レベルで変更を引き起こす可能性があり、カーネル レベルのスレッドは独自のペースで実行を続けます。
- カーネルレベルのスレッド
これらのスレッドは、進行中のプロセスからほとんど独立しており、オペレーティング システムによって実行されます。
これらのスレッドは、メモリ管理、プロセス管理などのタスクのためにオペレーティング システムによって必要とされます。
これらのスレッドは、オペレーティング システムに必要なプロセスを維持、実行、および報告するためです。カーネル レベルのスレッドは作成と管理にコストがかかり、これらのスレッドのコンテキスト切り替えは低速です。
カーネル レベルのスレッドのほとんどは、ユーザー レベルのスレッドによってプリエンプトされることはありません。
MS DOS written for Intel 8088 didn't have dual mode of operation. Thus, a user level process had the ability to corrupt the entire operating system.
- カーネル スレッドにマップされたユーザー レベルのスレッド
これはおそらく最も興味深い部分です。多くのユーザー レベルのスレッドはカーネル レベルのスレッドにマップされ、カーネルと通信します。
顕著なマッピングのいくつかは次のとおりです。
一対一
1 つのユーザー レベル スレッドが 1 つのカーネル スレッドのみにマップされる場合。
利点: 各ユーザー スレッドが 1 つのカーネル スレッドにマップされます。ユーザー スレッドの 1 つがブロッキング システム コールを発行しても、他のプロセスは影響を受けません。
短所: すべてのユーザー スレッドは対話するために 1 つのカーネル スレッドを必要とし、カーネル スレッドの作成と管理にはコストがかかります。
多対一
多くのユーザー スレッドが 1 つのカーネル スレッドにマップされる場合。
利点: 同様のユーザー スレッドを 1 つのカーネル スレッドにマップできるため、複数のカーネル スレッドは必要ありません。
不利な点: ユーザー スレッドの 1 つがブロッキング システム コールを発行したとしても、そのカーネル スレッドにマップされた他のすべてのユーザー スレッドはブロックされます。
また、カーネルは一度に 1 つのカーネル スレッドしか処理しないため、適切なレベルの同時実行性を実現できません。
多対多
多くのユーザー スレッドが、同等またはそれ以下の数のカーネル スレッドにマップされている場合。プログラマーは、ユーザー スレッドの数をカーネル スレッドの数にマップするかを決定します。一部のユーザー スレッドは、1 つのカーネル スレッドにのみマップされる場合があります。
利点: 優れたレベルの並行性が達成されます。プログラマーは、ブロッキング システム コールを発行する可能性がある潜在的に危険なスレッドを特定し、それらを 1 対 1 のマッピングで配置できます。
不利な点: カーネル スレッドの数は、慎重に決定しないと、システムの速度が低下する可能性があります。
あなたの質問の他の部分:
カーネルがサポートするスレッドは、ユーザーレベルのスレッドでは利用できないシステムコールやその他の用途のためにカーネルにアクセスできます。
では、ユーザーレベルのスレッドは、カーネルがサポートするスレッドを使用して、その状態のために通常実行できなかった操作を実行するときに、プログラマによって作成された単なるスレッドですか?
部分的に正しい。カーネル スレッドは OS のプロセスの実行を担当するため、ほとんどすべてのカーネル スレッドがシステム コールやその他の重要な割り込みにアクセスできます。ユーザー スレッドは、これらの重要な機能の一部にアクセスできません。たとえば、テキスト エディタは、プロセスの物理アドレスを変更する機能を持つスレッドを起動することはできません。ただし、必要に応じて、ユーザー スレッドはカーネル スレッドにマップし、独立したエンティティとして実行できなかったシステム コールの一部を発行できます。カーネル スレッドは、このシステム コールをカーネルにマップし、適切と判断された場合にアクションを実行します。