ドキュメントはかなり紛らわしいので、「実際の " Linux モデル:
- Linux カーネル内では、実行 (およびスケジュール) できるものを「プロセス」と呼びます。
- 各プロセスには、システム固有のプロセス ID (PID) とスレッド グループ ID (TGID) があります
- 「通常の」プロセスには PID=TGID があり、この TGID 値を共有するプロセスは他にありません。
- 「スレッド化された」プロセスは、TGID 値が他のプロセスと共有されるプロセスです。
- 同じ TGID を共有する複数のプロセスは、少なくとも同じメモリ空間とシグナル ハンドラ (場合によってはそれ以上) も共有します。
- 「スレッド化された」プロセスに PID=TGID がある場合、それを「メインスレッド」と呼ぶことができます
getpid()
を呼び出す どのプロセスからでも、その TGID (=「メイン スレッド」PID) が返されます。gettid()
を呼び出す どのプロセスからでも、その PID (!) が返されます。clone(2)
を使用してあらゆる種類のプロセスを作成できます システムコール、- プロセス間で共有されるものは、特定のフラグを
clone(2)
に渡すことによって決定されます 、 ls /proc
でリストできるフォルダの数値名/proc/NUMBER
として TGID、/proc/TGID/task
のフォルダの数値名/proc/TGID/task/NUMBER
として は PID です。- 既存のすべての PID が
ls /proc
であるとは限りませんが、 、あなたはまだcd /proc/any_PID
を行うことができます .
結論 :カーネルの観点からは、プロセスのみが存在し、それぞれが独自の一意の PID を持ち、いわゆるスレッドは単なる異なる種類のプロセスです (少なくとも、同じメモリ空間とシグナルハンドラーを 1 つまたは複数の他のプロセスと共有します)。 -s).
注: Linux での「スレッド」概念の実装により、語彙の混乱が生じました。getpid()
あなたに嘘をついています は、あなたが思っていたようには動作しません。これは、その動作が POSIX 互換性に従っているためです (スレッドは共通の PID を共有することになっています)。
Linux では、スレッドとプロセスの間に違いはまったくありません。 clone(2) を見ると、スレッド間で共有されるものと共有されないものを決定する一連のフラグが表示されます。
従来のプロセスは、何も共有しない単なるスレッドです。 Linux で必要なコンポーネントを共有できます。
これは、はるかに大きな違いがある他の OS 実装には当てはまりません。
スレッドは Linux でのプロセスです。それらは clone
で作成されます kill
経由でシグナルを送信できるプロセス ID を返すシステム コール プロセスのようなシステムコール。スレッド プロセスは ps
で表示されます 出力。 clone
call には、スレッド プロセスと共有される親プロセスの環境の量を決定するフラグが渡されます。