すべてのプロセスまたは軽量プロセスの場合、tgidとpidは同じ概念です。
/proc/${pid}/status
tgidとpidは別のフィールドです。プロセスや軽量プロセスについてtgidとpidが異なりますか?
ありがとうございます。
答え1
ビュー/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)にマップします。 。
答え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