Linuxはスレッドとサブプロセスをどのように区別しますか?

Linuxはスレッドとサブプロセスをどのように区別しますか?

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

それでは、Linuxはスレッドとプロセスのサブプロセスを区別するために特定のプログラムに何を提供しますか?例えば、Linuxでプロセスが所有するすべてのスレッドの詳細を表示する方法はありますか?

ありがとうございます。

答え1

観点からtask_struct見ると、プロセスのスレッドは同じスレッドグループリーダー(group_leader存在するtask_struct)、子プロセスには異なるスレッドグループリーダー(それぞれ別々の子プロセス)があります。

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

実際に追跡したいプログラムは彼らだけのスレッドオペレーティングシステム固有の情報を使用する代わりに、使用しているスレッドライブラリによって提供されるAPIに依存します。一般に、Unixファミリーシステムではpthreadを使用することを意味します。

答え2

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

    top -H -b -n 1
    
    • この-Hパラメーターは、トップに各個々のスレッドを表示するように指示します。通常、top は親プロセスの下のすべてのスレッドを要約します。
    • この-bパラメータを使用すると、topはバッチモードで実行されます。つまり、インタラクティブモードで実行され、表示されたデータを更新するのではなく、情報が収集され、表示されてから標準出力にダンプされます。
    • この-bオプションを使用すると、ユーザーは実行する回数を上部に知らせる必要があります。これは、-n実行回数の引数と最終パラメータによって行われます。

    したがって、top -H -b -n 1システムに「トップレベル実行、シングルスレッド表示、バッチモードで実行、および一度だけ実行」を指示します。

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

    ps -eLf
    

    この-eLfパラメータ(使用可能-e -L -f)は次のように分類されます。

    • eps所有者または現在の状態(アクティブ、スリープ、一時停止、I / O待機など)に関係なく、すべてのプロセスを表示するように指示します。
    • Lps別のスレッドを表示するように指示します。
    • 出力をフルフォーマットのリストにフォーマットし、パラメータと共にfNLWP(スレッド数)列とLWP(スレッドID)列を出力に追加するように指示します。psL

答え3

PID p1 を使用したプロセスを考えます。

子プロセスのオブジェクトにはtask_structp1のPPID(親PID)があり、そのPIDとTGIDはp2に設定されています。

p1スレッドのオブジェクトにはtask_structPIDがp3に設定されていますが、TGIDはp1に設定されています。

関連情報