GNU/Linux >> Linux の 問題 >  >> Linux

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

ドキュメントはかなり紛らわしいので、「実際の " 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 には、スレッド プロセスと共有される親プロセスの環境の量を決定するフラグが渡されます。


Linux
  1. システム管理者向けの30のLinuxプロセス演習

  2. Linux – Initプロセス:すべてのプロセスの祖先?

  3. Linux –現在閉じられている過去のスレッドのログ?

  1. Linux –異なるLinux / UNIXカーネルは交換可能ですか?

  2. UNIX / Linux:プロセスにシグナルを送信する 3 つの方法

  3. Linux スレッドの紹介 – パート I

  1. UNIX / Linux プロセス:C fork() 関数

  2. Linux プロセス、スレッド、軽量プロセス、およびプロセス状態とは

  3. Ubuntu Linux でのプロセスの管理