tgidとpidは、どのプロセスでも、どの軽量プロセスでも同じ概念です。
/proc/${pid}/status
、tgidおよびpidは別個のフィールドです。 tgidとpidは、プロセスまたは軽量プロセスでこれまでに異なりますか?
ありがとう。
/proc/${pid}/status
を見ると、Tgid:
フィールドとPid:
フィールドは、プロセスまたはプロセスのメインスレッドで同じであるため、常に一致します。
2つの別々のフィールドがある理由は、同じコードが/proc/${pid}/task/${tid}/status
の生成に使用され、Tgid:
とPid:
が互いに異なる場合があるためです。 (より具体的には、上記で使用したファイル名テンプレートでは、Tgid:
は${pid}
と一致し、Pid:
は${tid}
と一致します。)
スレッドのサポートは後でLinuxカーネルにのみ追加され、その時点で、プロセスのスケジュールに使用されていたロジックを再利用してスレッドをスケジュールするようにスケジューラコードが変更されたため、名前は少しわかりにくいです。その結果、「pid」の概念を再利用して個々のスレッドを識別しました。したがって、事実上、カーネルの観点からは、「pid」は引き続きスレッドに使用され、「tgid」はプロセスに導入されました。ただし、ユーザースペースからはPIDにプロセスを識別させたいので、ps
などのユーザースペースユーティリティはカーネルの「tgid」をPIDにマップし、カーネルの「pid」を「tid」(スレッドID)にマップします。
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