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