プロセスや軽量プロセスについてtgidとpidが異なりますか?

プロセスや軽量プロセスについてtgidとpidが異なりますか?

すべてのプロセスまたは軽量プロセスの場合、tgidとpidは同じ概念です。

/proc/${pid}/statustgidとpidは別のフィールドです。プロセスや軽量プロセスについてtgidとpidが異なりますか?

ありがとうございます。

答え1

ビュー/proc/${pid}/statusTgid:フィールドPid:は、プロセスまたはプロセスの基本スレッドと同じであるため、常に一致します。

2つの別々のフィールドがあるのは、同じコードを使用してフィールドを生成するためです/proc/${pid}/task/${tid}/status。ここTgid:で、とはPid:異なる場合があります。 (より具体的には、上記で使用したファイル名テンプレート内でTgid:一致し、一致します。)${pid}Pid:${tid}


命名は少し混乱しています。主にスレッドサポートが後でLinuxカーネルに追加され、スケジューラコードがその時点でプロセスをスケジューリングするために使用されたロジックを再利用するように変更されたため、スレッドをスケジューリングできるためです。これにより、個々のスレッドを識別するために「pid」の概念を再利用しました。したがって、実際にカーネルの観点から見ると、「pid」はまだスレッドに使用され、「tgid」はプロセスに導入されました。ただし、ユーザースペースではまだPIDがプロセスを識別したいので、ユーザースペースユーティリティ(などps)はカーネルの「tgid」をPIDにマッピングし、カーネルの「pid」を「tid」(スレッドID)にマップします。 。

答え2

プロセスリーダーによって生成されたスレッドの場合、TGidとPidは異なります。

たとえば、私のプロセスを見てくださいpolkitd

% ps -Lp 2642                          
  PID   LWP TTY          TIME CMD
 2642  2642 ?        00:00:18 polkitd
 2642  2680 ?        00:00:00 gmain
 2642  2683 ?        00:00:30 gdbus
 2642  2685 ?        00:00:00 polkitd
 2642  2687 ?        00:00:00 JS GC Helper
 2642  2688 ?        00:00:00 JS Sour~ Thread
 2642  2692 ?        00:00:00 polkitd

流れを見ると2680

% egrep ^'(Tgid|Pid):' /proc/2680/status
Tgid:   2642
Pid:    2680

関連情報