まず者は、用語
ユーザレベルスレッドを定義してみましょう。つまり、カーネルはこれらのスレッドを直接認識していません。
カーネルレベルのスレッド: - カーネルによって作成および管理されます。すべてのカーネルレベルのスレッドカーネルは、関連情報を格納するためのデータ構造をいくつか保持しています。
これらの定義は普遍的ではないが、ほとんどの文献がそれらに同意する。(オペレーティングシステムの概念、最新のオペレーティングシステムなど)
ライブラリによって作成されたスレッドについては、常にユーザーレベルのスレッドです。 理解するポイントは、ユーザーレベルのスレッドからカーネルレベルのスレッドへのマッピングです。
どのような種類のマッピングを使用するかは、ライブラリ(JVM、.NET)によって異なります。すべてのユーザーレベルのスレッドが独自のカーネルレベルのスレッドにマップされる1対1のモデルを使用できます。または、複数のユーザースレッドが同じカーネルスレッドにマッピングされる、多対1モデルを使用できます。
Linuxに関しては、プロセスとスレッドを区別せず、親と子の間のリソース共有のレベルを制御する機能を提供します。クローンシステムコールを使用してこれを行うことができます。効果的なスレッドよりも最大の共有を持つ子プロセスを作成する場合は、一方、クローンにフラグを渡して、プロセスよりも何も共有されていない場合。
要約すると、プログラミングライブラリのスレッドは、常にユーザーレベルのスレッドです。それらは、カーネルによって(直接的に)作成も管理もされていないためです。
ありがとうございました。言語のライブラリが「ユーザースレッド」または「カーネルスレッド」を提供しているかどうかを確認するにはどうすればよいですか?たとえば、Javaやあなたがよく知っている言語では? – Ben
@Ben言語仕様は、通常、実装がどの種類のスレッドを使用するかを決定するために実装に任せます。 –