43

ここで本当に 2 つの質問があります。まず、(はい、私はすでにこれを検索しましたが、明確にしたかったのです)、ユーザー スレッドとカーネル スレッドの違いは何ですか? 1つはユーザープログラムによって生成され、もう1つはOSによって生成され、後者は特権命令にアクセスできるということですか? それらは概念的に同じですか、それともスレッド自体に実際の違いがありますか?

第二に、私の質問の本当の問題は次のとおりです。私が使用している本には、「ユーザースレッドとカーネルスレッドの間に関係が存在する必要がある」と書かれており、そのような関係のさまざまなモデルがリストされています。しかし、この本では、ユーザー スレッドが常に特定のカーネル スレッドにマップされなければならない理由が明確に説明されていません。どうしてこれなの?

4

2 に答える 2

40

カーネル スレッドは、オペレーティング システムによって維持されるスレッド オブジェクトです。これは、プロセッサによってスケジュールおよび実行できる実際のスレッドです。通常、カーネル スレッドは、アクセス許可の設定、優先順位などを持つ重量級のオブジェクトです。カーネル スレッド スケジューラは、カーネル スレッドのスケジューリングを担当します。

ユーザー プログラムは、独自のスレッド スケジューラを作成することもできます。独自の「スレッド」を作成し、コンテキスト スイッチをシミュレートしてそれらを切り替えることができます。ただし、これらのスレッドはカーネル スレッドではありません。各ユーザー スレッドは実際には単独で実行することはできず、ユーザー スレッドが実行される唯一の方法は、カーネル スレッドが実際にユーザー スレッドに含まれるコードを実行するように指示された場合です。とはいえ、ユーザー スレッドにはカーネル スレッドよりも大きな利点があります。それらは、必ずしも独自の優先度を持つ必要がないため、はるかに軽量にすることができ、単一のプロセスで管理できます (どのスレッドをいつ実行する必要があるかについてのより良い情報を持っている可能性があります)。セキュリティとロックのためのカーネル オブジェクト。

ユーザー スレッドをカーネル スレッドに関連付ける必要があるのは、ユーザー スレッド自体がユーザー プログラム内のデータの集まりにすぎないためです。カーネル スレッドはシステム内の実際のスレッドであるため、ユーザー スレッドが進行するためには、ユーザー プログラムはそのスケジューラーにユーザー スレッドを取得させ、それをカーネル スレッド上で実行させる必要があります。ユーザー スレッドとカーネル スレッド間のマッピングは、1 対 1 (1 : 1) である必要はありません。複数のユーザー スレッドで同じカーネル スレッドを共有し (一度に実行されるユーザー スレッドは 1 つだけ)、1 : n マッピングで異なるカーネル スレッド間でローテーションされる単一のユーザー スレッドを持つことができます。

于 2013-02-09T20:42:25.200 に答える