web-dev-qa-db-ja.com

Linuxカーネルスレッドは本当にカーネルプロセスですか?

LinuxがJava VMでユーザースレッドごとにカーネルスレッドを作成することを多くの場所で読みました。(「カーネルスレッド」という用語は2つの異なる方法で使用されています:

  1. コアOSの作業を行うために作成されたスレッド
  2. oSが認識し、ユーザーの作業を実行するようにスケジュールするスレッド。

後者のタイプについて話しています。)

Linuxプロセスは親と子の間の共有メモリ空間をサポートするので、カーネルスレッドはカーネルプロセスと同じですか、それとも本当に別のエンティティですか?

21
Ellen Spertus

Linuxでは、スレッドとプロセスにまったく違いはありません。 clone(2) を見ると、スレッド間で共有されるものと共有されないものを決定する一連のフラグが表示されます。

従来のプロセスは、何も共有しない単なるスレッドです。 Linuxで必要なコンポーネントを共有できます。

これは、はるかに大きな違いがある他のOS実装には当てはまりません。

25
Daniel Pittman

ドキュメンテーションはかなり混乱する可能性があるため、ここに "real" Linuxモデルを示します。

  • linuxカーネル内では、実行(およびスケジュール)できるものを「プロセス」と呼びます。
  • 各プロセスには、システム固有のプロセスID(PID)とスレッドグループID(TGID)があります。
  • 「通常の」プロセスにはPID = TGIDがあり、他のプロセスはこのTGID値を共有しません。
  • 「スレッド化された」プロセスは、TGID値が他のプロセスによって共有されるプロセスです。
  • 同じTGIDを共有するいくつかのプロセスは、少なくとも同じメモリ空間とシグナルハンドラ(時にはそれ以上)も共有します。
  • 「スレッド化された」プロセスにPID = TGIDがある場合、「メインスレッド」と呼ぶことができます。
  • 任意のプロセスから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を共有することになっています)。

27
Totor

スレッドはLinuxでのプロセスです。これらはcloneシステムコールで作成されます。これは、プロセスと同じように、killシステムコールを介してシグナルを送信できるプロセスIDを返します。スレッドプロセスはps出力に表示されます。 clone呼び出しには、親プロセスの環境のどの程度がスレッドプロセスと共有されるかを決定するフラグが渡されます。

18
Kyle Jones