LinuxがJava VMでユーザースレッドごとにカーネルスレッドを作成することを多くの場所で読みました。(「カーネルスレッド」という用語は2つの異なる方法で使用されています:
後者のタイプについて話しています。)
Linuxプロセスは親と子の間の共有メモリ空間をサポートするので、カーネルスレッドはカーネルプロセスと同じですか、それとも本当に別のエンティティですか?
Linuxでは、スレッドとプロセスにまったく違いはありません。 clone(2) を見ると、スレッド間で共有されるものと共有されないものを決定する一連のフラグが表示されます。
従来のプロセスは、何も共有しない単なるスレッドです。 Linuxで必要なコンポーネントを共有できます。
これは、はるかに大きな違いがある他のOS実装には当てはまりません。
ドキュメンテーションはかなり混乱する可能性があるため、ここに "real" Linuxモデルを示します。
getpid()
を呼び出すと、そのTGID(= "メインスレッド" PID)が返されます。gettid()
を呼び出すと、そのPID(!)、clone(2)
システムコールを使用して、あらゆる種類のプロセスを作成できます。clone(2)
に渡すことによって決定されます。ls /proc
_はTGIDであるため、_/proc/NUMBER
_でリストできるフォルダの数値名/proc/TGID/task
_はPIDであるため、_/proc/TGID/task/NUMBER
_内のフォルダの数値名ls /proc
_を使用して既存のすべてのPIDが表示されない場合でも、_cd /proc/any_PID
_を実行できます。結論:カーネルの観点からは、プロセスのみが存在し、それぞれに独自の一意のPIDがあり、いわゆるスレッドは異なる種類のプロセスです(少なくとも、同じメモリ空間を共有します)ハンドラーに1つまたは複数の他のシグナルを送信します。
注:Linuxでの「スレッド」の概念の実装により、語彙が混乱し、getpid()
あなたに嘘をついています これは、その動作がPOSIX互換性に従うためです(スレッドは共通のPIDを共有することになっています)。
スレッドはLinuxでのプロセスです。これらはclone
システムコールで作成されます。これは、プロセスと同じように、kill
システムコールを介してシグナルを送信できるプロセスIDを返します。スレッドプロセスはps
出力に表示されます。 clone
呼び出しには、親プロセスの環境のどの程度がスレッドプロセスと共有されるかを決定するフラグが渡されます。