web-dev-qa-db-ja.com

tgidとpidは、プロセスまたは軽量プロセスでこれまでに異なりますか?

tgidとpidは、どのプロセスでも、どの軽量プロセスでも同じ概念です。

/proc/${pid}/status、tgidおよびpidは別個のフィールドです。 tgidとpidは、プロセスまたは軽量プロセスでこれまでに異なりますか?

ありがとう。

1
Tim

/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
filbranden

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
2
Stephen Harris