Linuxは実際にプロセスとスレッドを区別しませんが、両方をデータ構造として実装しますtask_struct
。
それでは、Linuxはスレッドとプロセスのサブプロセスを区別するために特定のプログラムに何を提供しますか?例えば、Linuxでプロセスが所有するすべてのスレッドの詳細を表示する方法はありますか?
ありがとうございます。
答え1
観点からtask_struct
見ると、プロセスのスレッドは同じスレッドグループリーダー(group_leader
存在するtask_struct
)、子プロセスには異なるスレッドグループリーダー(それぞれ別々の子プロセス)があります。
この情報はユーザー空間に公開されます。渡すファイル/proc
システムorのフィールドを見ると親と子をppid
追跡できます(これは親pidを提供します)、orのフィールドを見るとスレッドを追跡できます(これはグループリーダーのPIDでもあるスレッドグループIDを提供します)。プロセスのスレッドはディレクトリに表示されます。各スレッドには独自のサブディレクトリがあります。 (各プロセスには少なくとも1つのスレッドがあります。)/proc/${pid}/stat
.../status
tgid
.../status
/proc/${pid}/task
実際に追跡したいプログラムは彼らだけのスレッドオペレーティングシステム固有の情報を使用する代わりに、使用しているスレッドライブラリによって提供されるAPIに依存します。一般に、Unixファミリーシステムではpthreadを使用することを意味します。
答え2
top
これにより、いくつかの追加オプションを指定してコマンドが実行されます。top -H -b -n 1
- この
-H
パラメーターは、トップに各個々のスレッドを表示するように指示します。通常、top は親プロセスの下のすべてのスレッドを要約します。 - この
-b
パラメータを使用すると、topはバッチモードで実行されます。つまり、インタラクティブモードで実行され、表示されたデータを更新するのではなく、情報が収集され、表示されてから標準出力にダンプされます。 - この
-b
オプションを使用すると、ユーザーは実行する回数を上部に知らせる必要があります。これは、-n
実行回数の引数と最終パラメータによって行われます。
したがって、
top -H -b -n 1
システムに「トップレベル実行、シングルスレッド表示、バッチモードで実行、および一度だけ実行」を指示します。- この
この
ps
コマンドは、現在実行中のプロセスのスナップショットを報告します。ps -eLf
この
-eLf
パラメータ(使用可能-e -L -f
)は次のように分類されます。e
ps
所有者または現在の状態(アクティブ、スリープ、一時停止、I / O待機など)に関係なく、すべてのプロセスを表示するように指示します。L
ps
別のスレッドを表示するように指示します。- 出力をフルフォーマットのリストにフォーマットし、パラメータと共に
f
NLWP(スレッド数)列とLWP(スレッドID)列を出力に追加するように指示します。ps
L
答え3
PID p1 を使用したプロセスを考えます。
子プロセスのオブジェクトにはtask_struct
p1のPPID(親PID)があり、そのPIDとTGIDはp2に設定されています。
p1スレッドのオブジェクトにはtask_struct
PIDがp3に設定されていますが、TGIDはp1に設定されています。