2016-10-02 4 views
0

私は、このすべてのエンティティーと、それらがLinuxでどのように相互接続しているのか混乱しています。 「Unix internals」の本によれば、lightweight process (LWP)はカーネルでサポートされているユーザースレッドであり、そのカーネルはプロセス内のスレッドを認識しません。 Linuxの場合は本当ですか?Linuxのユーザースペースのスレッド、カーネルスレッド、軽量プロセス

私が理解しているように、カーネルの介入なしに、プロセス内でユーザ空間のスレッドをpthreadライブラリという高レベルの抽象化によってスケジュールしました。私は正しい?

答えて

1

Linuxのpthreadsでは、スレッドスケジューリングはカーネルによって処理されます。

Linuxでは、clone()システムコール(fork()はクローンの特別なケースです)を使用してスレッドまたはプロセスが作成されます。クローンに渡されるオプションに応じて、新しく作成されるプロセスは軽量または重い重さになります(つまり、メモリスペースとファイル記述子の別のセットなどがあります)。 pthread_create()は最小の分離量でclone()を使用します。

ネイティブスレッドをまったく使用しないで、setjmp()longjmp()を使用して、スレッドの完全なユーザー空間の実装を使用することもできます。これは、例えば、解釈された言語を実装するために使用することができます。しかし、実際に独自のユーザ空間スケジューラを実装しているプログラムやライブラリの具体的な例はわかりません。

もう1つ:「カーネルスレッド」は、カーネル空間で実行される、つまりカーネル自体の一部であるスレッドを指定するために一般的に使用されます。 では、[kthreadd]のような角括弧で囲まれているため、このようなスレッドは認識可能です。

+1

LinuxThreadsの実装では、カーネルスケジューラブルスレッドマッピングに1:1のユーザスレッドが使用されています(これはプロセスにのみマップされ、NPTL-glibcのposixスレッドはカーネルスケジューラブルスレッドにマッピングされます)。 NGPT(Next Generation POSIX Threads)は2003年まではおそらく1:1以外のマッピングしかありませんでした。 https://en.wikipedia.org/wiki/Green_threadsは、言語インタープリターで実装されることがあります。 – osgx

+0

@osgx OK、説明に感謝します。混乱を避けるため、LinuxThreadsへの参照を削除しました。 – Arnout

0

実際、ユーザー空間に実装されたスレッドの場合、カーネルはスレッドを認識しません。 OSがスレッドを認識していないので、1つのスレッドがブロックすると、同じプロセスに属する他のスレッドもブロックされます。

+1

この回答に記載されている情報は、ほとんど間違っている場合があります。最初の段落は、ユーザー空間で実装されたスレッドを表すため、正しいです。しかし、一般的にはLightWeightProcessesについて話し続けますが、これは通常は通常のプロセスであり、ユーザー空間に実装されたスレッドではありません。また、カーネルスレッドは、カーネル空間内で完全に動作するスレッドであり、ユーザー空間に対応するスレッドはありません。 – Arnout

関連する問題