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


19

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

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

私は後者のタイプについて話している。)

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

回答:


23

Linuxのスレッドとプロセスにはまったく違いはありません。あなたが見ればクローン(2)あなたは共有されているかを決定するフラグのセット、そしてどのようなスレッド間で共有されていないが表示されます。

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

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


22

ドキュメントはかなりわかりにくいので、ここに「実際の」Linuxモデルを示します。

  • Linuxカーネル内では、実行(およびスケジュール)できるものは「プロセス」と呼ばれ、
  • 各プロセスには、システム固有のプロセスID(PID)とスレッドグループID(TGID)があります。
  • 「通常の」プロセスにはPID = TGIDがあり、他のプロセスはこのTGID値を共有しません。
  • 「スレッド化された」プロセスは、TGID値が他のプロセスと共有されるプロセスです。
  • 同じTGIDを共有する複数のプロセスは、少なくとも同じメモリスペースとシグナルハンドラ(少なくともそれ以上)も共有します。
  • 「スレッド化された」プロセスにPID = TGIDがある場合、「メインスレッド」と呼ばれます。
  • getpid()任意のプロセスから呼び出すと、TGID(=「メインスレッド」PID)が返されます。
  • gettid()プロセスから呼び出すと、そのPID(!)が返されます。
  • clone(2)システムコールであらゆる種類のプロセスを作成できます。
  • TGID とls /proc同様にリストできるフォルダーの数値名/proc/NUMBER
  • PIDと/proc/TGID/task同様にフォルダの数値名/proc/TGID/task/NUMBER
  • すべての既存のPIDが表示されていないとしてもls /proc、あなたはまだできますcd /proc/any_PID

結論:カーネルの観点から見ると、プロセスのみが存在し、それぞれが独自の一意のPIDを持ち、いわゆるスレッドは単なる異なる種類のプロセスです。

注: Linuxでの「スレッド」の概念の実装は語彙の混乱を招き、getpid() あなたが嘘をついていると思っていることしない場合、その動作はPOSIX互換性に従うためです(スレッドは共通のPIDを共有することになっています) 。


1
提案:「タスク」という単語を使用すると、プロセス/スレッドの混乱をそれほど招くことなく、実行可能なものを参照するのに役立ちます。
トーター

17

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


1
pthreads(7)は、現在のNPTL(ネイティブPOSIXスレッドライブラリ)実装では、「プロセス内のすべてのスレッドは同じスレッドグループに配置され、スレッドグループのすべてのメンバーは同じPIDを共有します」と言います。廃止されたLinuxThreads実装では、各「スレッド」には独自のPIDがあります。
トーター
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.