2017-10-25 10 views
1

私は、プロセス、カーネルレベルのスレッド、およびユーザーレベルのスレッドの違いについて疑問を持ち始めます。プログラミングライブラリまたはモジュール内のプロセスとスレッドは、プロセス、カーネルレベルのスレッド、またはユーザーレベルのスレッドを意味しますか?

Linux APIのプロセスとスレッドは、プロセス、カーネルレベルのスレッド、またはユーザーレベルのスレッドを意味しますか?

Python、Java、C#などのプログラミング言語の標準モジュールに同じ質問がありますか?

ありがとうございました。

答えて

3

LinuxプロセスとLinuxスレッドは明らかに "カーネルレベル"になります。Linux カーネルです。しかし、他のオペレーティングシステムと同様、Linuxではプロセスとスレッドの区別が鋭くないことに注意してください。 Linuxプロセスとスレッドはcloneシステムコール(http://man7.org/linux/man-pages/man2/clone.2.html)で作成され、クローンの結果を "プロセス"か "スレッド"と呼ぶかどうかは、どのオプションを指定するかによって異なります。

言語XまたはライブラリYについては、スレッドが「ユーザースレッド」(別名「グリーンスレッド」)か「カーネルスレッド」(別名「ネイティブスレッド」)かどうかは、どの言語/ライブラリあなたが話していることは、特定のバージョンと、あなたが話しているライブラリや言語の具体的な実装に依存することがあります。カーネルの外にいくつかのライブラリーによって作成および管理されるスレッド - :

+0

ありがとうございました。言語のライブラリが「ユーザースレッド」または「カーネルスレッド」を提供しているかどうかを確認するにはどうすればよいですか?たとえば、Javaやあなたがよく知っている言語では? – Ben

+0

@Ben言語仕様は、通常、実装がどの種類のスレッドを使用するかを決定するために実装に任せます。 –

0

まず者は、用語

ユーザレベルスレッドを定義してみましょう。つまり、カーネルはこれらのスレッドを直接認識していません。

カーネルレベルのスレッド: - カーネルによって作成および管理されます。すべてのカーネルレベルのスレッドカーネルは、関連情報を格納するためのデータ構造をいくつか保持しています。

これらの定義は普遍的ではないが、ほとんどの文献がそれらに同意する。(オペレーティングシステムの概念、最新のオペレーティングシステムなど)

ライブラリによって作成されたスレッドについては、常にユーザーレベルのスレッドです。 理解するポイントは、ユーザーレベルのスレッドからカーネルレベルのスレッドへのマッピングです。

どのような種類のマッピングを使用するかは、ライブラリ(JVM、.NET)によって異なります。すべてのユーザーレベルのスレッドが独自のカーネルレベルのスレッドにマップされる1対1のモデルを使用できます。または、複数のユーザースレッドが同じカーネルスレッドにマッピングされる、多対1モデルを使用できます。

Linuxに関しては、プロセスとスレッドを区別せず、親と子の間のリソース共有のレベルを制御する機能を提供します。クローンシステムコールを使用してこれを行うことができます。効果的なスレッドよりも最大の共有を持つ子プロセスを作成する場合は、一方、クローンにフラグを渡して、プロセスよりも何も共有されていない場合。

要約すると、プログラミングライブラリのスレッドは、常にユーザーレベルのスレッドです。それらは、カーネルによって(直接的に)作成も管理もされていないためです。

関連する問題