PIDとTIDの違いは何ですか?
標準的な答えは、PIDはプロセス用で、TIDはスレッド用です。ただし、一部のコマンドはそれらを同じ意味で使用することがわかりました。たとえば、htop
にはPIDの列があり、同じプロセスのスレッドのPIDが(異なる値で)表示されます。それでは、PIDはいつスレッドまたはプロセスを表しますか?
複雑です:pidはプロセス識別子です。 tidはスレッド識別子です。
しかし、実際には、カーネルはそれらを実際に区別していません。スレッドはプロセスに似ていますが、同じ他のインスタンス(メモリ、fds ...)と同じgroupを共有しています。
したがって、tidは実際にはカーネル(スレッド)のスケジュール可能なオブジェクトの識別子であり、pidはメモリとfdsを共有するスケジュール可能なオブジェクトのグループの識別子です(プロセス)。
しかし、物事をより面白くするために、プロセスにスレッドが1つしかない場合(初期状態と古き良き時代には1つだけ)、pidとtidは常に同じ。したがって、tidで機能する関数は、pidで自動的に機能します。
pidで動作するように文書化された多くの関数/システムコール/コマンドラインユーティリティが実際にtidsを使用していることに注意してください。しかし、効果がプロセス全体に及ぶ場合、違いに気付かないでしょう。
実際、Linuxプロセスの各スレッドはライトウェイトプロセス(LWP)です。したがって、人々はスレッドをプロセスとして呼び出すかもしれません...しかし、確かに違いがあります。プロセス内の各スレッドは異なるスレッドID(TID)を持ち、同じプロセスID(PID)を共有します。
Pthreadライブラリ関数を使用している場合、これらの関数はこれらのTIDを使用しません。これらはカーネル/ OSレベルのスレッドIDであるためです。