カーネル スレッドは、オペレーティング システムによって維持されるスレッド オブジェクトです。これは、プロセッサによってスケジュールおよび実行できる実際のスレッドです。通常、カーネル スレッドは、アクセス許可の設定、優先順位などを持つ重量級のオブジェクトです。カーネル スレッド スケジューラは、カーネル スレッドのスケジューリングを担当します。
ユーザー プログラムは、独自のスレッド スケジューラを作成することもできます。独自の「スレッド」を作成し、コンテキスト スイッチをシミュレートしてそれらを切り替えることができます。ただし、これらのスレッドはカーネル スレッドではありません。各ユーザー スレッドは実際には単独で実行することはできず、ユーザー スレッドが実行される唯一の方法は、カーネル スレッドが実際にユーザー スレッドに含まれるコードを実行するように指示された場合です。とはいえ、ユーザー スレッドにはカーネル スレッドよりも大きな利点があります。それらは、必ずしも独自の優先度を持つ必要がないため、はるかに軽量にすることができ、単一のプロセスで管理できます (どのスレッドをいつ実行する必要があるかについてのより良い情報を持っている可能性があります)。セキュリティとロックのためのカーネル オブジェクト。
ユーザー スレッドをカーネル スレッドに関連付ける必要があるのは、ユーザー スレッド自体がユーザー プログラム内のデータの集まりにすぎないためです。カーネル スレッドはシステム内の実際のスレッドであるため、ユーザー スレッドが進行するためには、ユーザー プログラムはそのスケジューラーにユーザー スレッドを取得させ、それをカーネル スレッド上で実行させる必要があります。ユーザー スレッドとカーネル スレッド間のマッピングは、1 対 1 (1 : 1) である必要はありません。複数のユーザー スレッドで同じカーネル スレッドを共有し (一度に実行されるユーザー スレッドは 1 つだけ)、1 : n マッピングで異なるカーネル スレッド間でローテーションされる単一のユーザー スレッドを持つことができます。