PID と TID の違いは何ですか?
標準的な答えは、PID はプロセス用であり、TID はスレッド用であるというものです。ただし、一部のコマンドはそれらを同じ意味で使用していることがわかりました。たとえば、htop
PID の列があり、同じプロセスのスレッドの PID が (異なる値で) 表示されます。では、PID がスレッドまたはプロセスを表すのはいつでしょうか?
複雑です。pidはプロセス識別子です。tidはスレッド識別子です。
しかし、たまたま、カーネルはそれらを実際に区別しません。スレッドはプロセスと同じですが、同じグループの他のインスタンスといくつかのもの(メモリ、fds ...)を共有します。
したがって、tidは実際にはカーネル(スレッド)内のスケジュール可能なオブジェクトの識別子であり、pidはメモリとfds(プロセス)を共有するスケジュール可能なオブジェクトのグループの識別子です。
しかし、もっと面白くするために、プロセスにスレッドが1つしかない場合(初期の状況と古き良き時代には1つだけ)、pidとtidは常に同じです。したがって、tidで機能する関数は、自動的にpidで機能します。
pidで動作するように文書化されている多くの関数/システムコール/コマンドラインユーティリティが実際にtidsを使用していることは注目に値します。ただし、効果がプロセス全体に及ぶ場合は、違いに気付かないでしょう。
実際、Linux プロセスの各スレッドは軽量プロセス (LWP) です。だから、スレッドをプロセスと呼ぶ人もいるかもしれませんが、確かに違いがあります。プロセス内の各スレッドは、異なるスレッド ID (TID) を持ち、同じプロセス ID (PID) を共有します。
pthread ライブラリ関数を使用している場合、これらの関数はこれらの TID を使用しません。これらはカーネル/OS レベルのスレッド ID であるためです。
clone
pid と tid は、 withの呼び出しでプロセスが作成された場合を除いて同じですCLONE_THREAD
( のマニュアル ページによるgettid
)。この場合、一意のスレッド ID を取得しますが、同じスレッド グループに属するすべてのスレッドは同じプロセス ID を共有します。
getpid
ただし、返された値がキャッシュされる可能性があることを読んだことも思い出します (ソースは見つかりません) 。
[更新]キャッシュの効果に関する議論については、こちらNOTES
のセクションを参照してください。pids