次の出力を出力するプログラムpstree -p 31872を実行しました。
Ruby(31872)─┬─{Ruby}(31906)
└─{Ruby}(32372)
Pstreeのmanページには、次のように書かれています。
プロセスの子スレッドは親プロセスの下にあり、中括弧で囲まれたプロセス名で表示されます。
icecast2---13*[{icecast2}]
(上記は、圧縮を無効にする-pオプションがないため、異なって表示されます。)
-pなしでpstree 31872を実行すると、次のようになります。
Ruby───2*[{Ruby}]
psを使用してそれらのPIDSを観察しようとすると、結果が見つかりません。ただし、pidは/ procにあります。
私の質問は、スレッドに異なるPIDがあるのはなぜですか?私はそれらがプロセスと同じ(31872)であることを期待します。 htopを実行すると、同じ動作が観察されます。
間違いは、それらの数値が実際にはTIDS(スレッドID)であるのにPIDSであると推定することでした。 Linux関数gettid(2)を参照してください。 clone(2)を読むと、追加の(そして興味深い)詳細がたくさん得られます。
多くの場合、スレッドは異なるプロセスです。少なくともLinuxでは、「スレッド」は多くの場合、親プロセスとメモリを共有しているプロセスのクローンです。
ただし、一部の言語では、スレッドは言語VMでシミュレートされる「グリーン」スレッドであるため、メインプロセスの一部のままになります。 Javaおよびpythonはこれで有名です。