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