web-dev-qa-db-ja.com

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

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

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

ありがとう。

22
Tim

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

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

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

29
Stephen Kitt
  1. これは、いくつかの追加オプションを指定してtopコマンドを実行します。

    top -H -b -n 1
    
    • -H引数は、個々のスレッドを表示するようtopに指示します。通常、topは親プロセスの下のすべてのスレッドを要約します。
    • -b引数は、topをバッチモードで実行します。対話モードで実行して表示されたデータを更新するのではなく、情報を収集して表示し、stdoutにダンプします。
    • -bオプションを使用すると、ユーザーはtopに何回実行するかを通知する必要があります。これは、-n引数と、最後の引数を実行回数で行います。

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

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

    ps -eLf
    

    -eLf引数(-e -L -fとしても使用できます)は次のように分類されます。

    • eは、psに、所有者や現在のステータス(アクティブ、スリープ、一時停止、I/Oの待機など)に関係なく、すべてのプロセスを表示するように指示します。
    • Lpsに個々のスレッドを表示するように指示します
    • fpsに出力を完全な形式のリストとしてフォーマットするように指示し、L引数と組み合わせてNLWP(スレッド数)およびLWP(スレッドID)列が出力に追加されます。
5
ivanivan

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

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

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

1
NOLFXceptMe