Linuxは子プロセスとは別にスレッドにどのように通知しますか?


21

Linuxは実際にはプロセスとスレッドを区別せず、両方をデータ構造として実装しますtask_struct

Linuxは、子プロセスからプロセスのスレッドを伝えるために、いくつかのプログラムに何を提供しますか?たとえば、Linuxでプロセスが持つすべてのスレッドの詳細を表示する方法はありますか?

ありがとう。

回答:


28

task_struct観点から見ると、プロセスのスレッドには同じスレッドグループリーダー(group_leaderintask_struct)がありますが、子プロセスには異なるスレッドグループリーダー(各子プロセス)があります。

この情報は、ファイルシステムを介してユーザー空間に公開されます/proc。または(親pidを与える)のppidフィールドを見ることで、親と子を追跡できます。のフィールドを見てスレッドをトレースできます(これにより、グループリーダーのpidでもあるスレッドグループIDが得られます)。プロセスのスレッドはディレクトリに表示されます。各スレッドは独自のサブディレクトリを取得します。(すべてのプロセスには少なくとも1つのスレッドがあります。)/proc/${pid}/stat.../statustgid.../status/proc/${pid}/task

実際には、独自のスレッドを追跡したいプログラムは、OS固有の情報を使用する代わりに、使用しているスレッドライブラリによって提供されるAPIに依存します。通常、Unixのようなシステムでは、pthreadを使用することを意味します。


シェルパイプラインの各プロセス(echo foo | cat)は同じグループリーダー(shell)を共有しますが、同じプロセスのスレッドではありません。
-psusi

2
あなたはプロセスグループについて話している。私の答えでは、グループリーダーはカーネルの観点からのものです。カーネルのアカウンティングでは、個別のプロセスが独自のグループリーダーです。これを確認するには、各プロセスのファイルの値を実行(sleep 120 | sleep 120) &して確認し ます。Tgidsleep/proc/${pid}/status
スティーブンキット

おかしい 「スレッドグループリーダー」のようなものがあることは知りませんでしたが、マルチスレッドプロセスのスレッドはすべて同等であり、「リーダー」はいないと考えました。それらのいずれも終了でき、1つが残っている限り、プロセスは停止していません。
-psusi

5
  1. これによりtop、いくつかの追加オプションを指定してコマンドが実行されます。

    top -H -b -n 1
    
    • -H引数には、個々のスレッドを表示するには、トップを指示します。通常topは、親プロセスの下のすべてのスレッドを要約します。
    • -b引数はバッチモードでトップ走行を作る-情報が収集され、表示され、その後、対話モードで実行されていると表示されたデータをリフレッシュするとは対照的に、標準出力にダンプ。
    • この-bオプションを使用すると、ユーザーはtopに実行回数を伝える必要があります。これは、-n引数と最後の引数に実行回数を指定して行われます。

    したがってtop -H -b -n 1、システムに「トップを実行し、個々のスレッドを表示し、バッチモードで実行し、1回だけ実行する」ように指示します。

  2. このpsコマンドは、現在実行中のプロセスのスナップショットを報告します。

    ps -eLf
    

    -eLf引数は、(として使用することができ-e -L -f、次のように同様に)破壊します:

    • eps所有者や現在のステータス(アクティブ、スリープ、一時停止、I / Oの待機など)に関係なく、すべてのプロセスを表示するように指示します。
    • Lps個々のスレッドを表示するように指示します
    • 出力をフルフォーマットのリストとしてフォーマットするfように指示psし、L引数とともにNLWP(スレッドの数)列とLWP(スレッドID)列が出力に追加されます。

1

PID p1のプロセスを考えます

task_struct子プロセスのオブジェクトのPPID(親PID)はp1であり、そのPIDとTGIDは、たとえばp2に設定されます。

task_structp1のスレッドのオブジェクトのPIDは、たとえばp3に設定されますが、TGIDはp1に設定されます。


あなたはスティーブン・キットと同じことを言っいるのですが、それほど明確ではありません。PSスレッドのPPIDが何であるかを言わないのに、なぜPPIDを議論に参加させるのですか?
スコット

PIDとTGIDは常に同じです。
ティム
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.